設計模式-工廠模式

工廠模式

工廠模式主要是爲創建對象提供過渡接口,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。封裝性好,通過簡單工廠,實現了客戶端和具體實現類的解耦。

分類

1)簡單工廠模式(Simple Factory):不利於產生系列產品;
2)工廠方法模式(Factory Method):又稱爲多形性工廠;
3)抽象工廠模式(Abstract Factory):又稱爲工具箱,產生產品族,但不利於產生新的產品;
GOF在《設計模式》一書中將工廠模式分爲兩類:工廠方法模式(Factory Method)與抽象工廠模式(Abstract Factory)。將簡單工廠模式(Simple Factory)看爲工廠方法模式的一種特例,兩者歸爲一類。

工廠方法模式(包含簡單工廠模式)

簡單工廠模式又稱靜態工廠方法模式。從命名上就可以看出這個模式一定很簡單。它存在的目的很簡單:定義一個用於創建對象的接口。在簡單工廠模式中,一個工廠類處於對產品類實例化調用的中心位置上,它決定那一個產品類應當被實例化, 如同一個交通警察站在來往的車輛流中,決定放行那一個方向的車輛向那一個方向流動一樣。
 先來看看它的組成:
a) 工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯。在java中它往往由一個具體類實現。在java中由接口或者抽象類來實現。工廠類在客戶端的直接控制下(Create,LightSimpleFactory方法)創建產品對象。
b) 抽象產品角色:它一般是具體產品繼承的父類或者實現的接口。定義簡單工廠創建的對象的父類或它們共同擁有的接口。可以是一個類、抽象類或接口。
c) 具體產品角色:工廠類所創建的對象就是此角色的實例。在java中由一個具體類實現。定義工廠具體加工出的對象。
優點:
工廠類可以決定創建哪一個產品類的實例,客戶端可以免除直接創建產品對象的責任,而僅僅"消費"產品。實現了對責任的分割。
缺點:
工廠類集中了所有產品創建邏輯,一旦工廠不能正常工作,整個系統都要受到影響。
系統擴展困難,一旦添加新產品就不得不修改工廠邏輯(生產線)。

工廠類角色:
public class LightSimpleFactory {
	 public Light create(String lightType){
	      if(lightType == "red")
	         return new RedLight();
	      else if(lightType == "green")
	         return new GreenLight();
	      else
	         return null;
	   }
}

抽象產品角色:
public interface Light {
	public abstract void turnOn();

	public abstract void turnOff();
}

具體產品角色:

public class RedLight implements Light {

	@Override
	public void turnOff() {
		System.out.println(" red light turn off");
	}

	@Override
	public void turnOn() {
		System.out.println(" red light turn on");
	}
	
}

public class GreenLight implements Light {

	@Override
	public void turnOff() {
		System.out.println(" green light turn off");
	}

	@Override
	public void turnOn() {
		System.out.println(" green light turn on");
	}

}

客戶端:
public class Test {

	public static void main(String[] args) {
		LightSimpleFactory lightSimpleFactory= new LightSimpleFactory();
		Light redRight = lightSimpleFactory.create("red");
		redRight.turnOn();
		redRight.turnOff();
		Light greenRight = lightSimpleFactory.create("green");
		greenRight.turnOn();
		greenRight.turnOff();
//		print
//		 red light turn on
//		 red light turn off
//		 green light turn on
//		 green light turn off

	}
}

抽象工廠模式

a)抽象工廠(Creator)角色:是工廠方法模式的核心,與應用程序無關。任何在模式中創建的對象的工廠類必須實現這個接口。
b)具體工廠(Concrete Creator)角色:這是實現抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,並且受到應用程序調用以創建產品對象。在上圖中有兩個這樣的角色:BulbCreator與TubeCreator。
c)抽象產品(Product)角色:工廠方法模式所創建的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。在上圖中,這個角色是Light。
d)具體產品(Concrete Product)角色:這個角色實現了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創建,它們之間往往一一對應。

抽象工廠
public interface ILightFactory {
	public Light creat();
}

具體工廠

public class RedLightFactory implements ILightFactory {
	@Override
	public Light creat() {
		return new RedLight();
	}
}

public class GreenLightFactory implements ILightFactory {
	@Override
	public Light creat() {
		return new GreenLight();
	}
}

抽象角色
public interface ILight {
	public abstract void turnOn();

	public abstract void turnOff();
}

具體角色
public class RedLight implements ILight {

	@Override
	public void turnOff() {
		System.out.println(" red light turn off");
	}

	@Override
	public void turnOn() {
		System.out.println(" red light turn on");
	}
	
}

public class GreenLight implements ILight {

	@Override
	public void turnOff() {
		System.out.println(" green light turn off");
	}

	@Override
	public void turnOn() {
		System.out.println(" green light turn on");
	}
}

客戶端

public class Test {

	public static void main(String[] args) {
		ILightFactory redLightFactory= new RedLightFactory();
		RedLight redLight = (RedLight) redLightFactory.creat();
		redLight.turnOn();
		redLight.turnOff();

		ILightFactory greenLightFactory= new GreenLightFactory();
		GreenLight greenLight = (GreenLight) greenLightFactory.creat();
		greenLight.turnOn();
		greenLight.turnOff();
//		 red light turn on
//		 red light turn off
//		 green light turn on
//		 green light turn off

	}
}



public class RedLightFactory implements ILightFactory {
	@Override
	public Light creat() {
		return new RedLight();
	}
}

public class GreenLightFactory implements ILightFactory {
	@Override
	public Light creat() {
		return new GreenLight();
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章