首頁>資訊>

一. 與工廠模式的區別

工廠模式:定義一個建立物件的介面,讓其子類自己決定例項化哪一個工廠類,工廠模式使其建立過程延遲到子類進行。

抽象工廠模式:提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。

關於抽象工廠,我是這樣理解的,抽象工廠更像是簡單工廠模式的高階版,簡單工廠模式只能生產一類產品的多個型號,而抽象工廠能生產不同類別的產品。舉個例子,一家水果店只賣蘋果,有紅富士,還有嘎啦果。如果想賣梨子,就得重新開一家水果店了(新建一個工廠類)。可能有人會有疑問,為什麼不重新裝修一下賣蘋果的店子,讓它也能賣梨子?事實是為了遵循oop中的開閉原則,在擴充套件時一般不會去直接修改原始碼。這個時候抽象工廠就能很好的解決問題了。

現在,我們把水果店當作一個抽象工廠,店內的賣不同水果的櫃檯當作實際售賣水果的工廠。如果有新類目水果增加,我們只需要在水果店(抽象工廠)內增加一個新櫃檯(售賣水果的工廠類),櫃檯就可以賣該種水果的不同型別了。

二. 具體實現

該圖是菜鳥教程上的一張圖,下面的具體實現和上面這張圖的結構一樣,所以就懶得重新畫一遍了。

1.先建立一個超級工廠,也就是我們果蔬店
public abstract class AbstractFactory { 	public abstract Fruit getFruit(String name);		public abstract Vegetables getVegetables(String name);	}
2.水果店有了,接下來該建立賣具體果蔬的的櫃檯
public class VegetablesFactory extends AbstractFactory { 	@Override	public Fruit getFruit(String name) {		// TODO Auto-generated method stub		return null;	} 	@Override	public Vegetables getVegetables(String name) {		// TODO Auto-generated method stub		if(name=="tomato") {			return new Tomato();		}				if(name=="eggplant") {			return new Eggplant();		}		return null;	} }
public class FruitFactory extends AbstractFactory{ 	@Override	public Fruit getFruit(String name) {		// TODO Auto-generated method stub		if(name=="apple") {			return new Apple();		}		if(name=="banana") {			return new Banana();		}		return null;	} 	@Override	public Vegetables getVegetables(String name) {		// TODO Auto-generated method stub		return null;	} }
3.這一步和簡單工廠模式一樣,建立櫃檯售賣的具體物品(介面+實現類)。介面:水果,蔬菜。實現類:蘋果,香蕉,茄子,西紅柿。
public interface Fruit { 	void desc();}
public  class Apple implements Fruit { 	@Override	public void desc() {				System.out.println("我是蘋果");	}	}
public class Banana implements Fruit { 	@Override	public void desc() {		// TODO Auto-generated method stub     System.out.println("我是香蕉");	} }
public interface Vegetables { 	public void desc();			}
public class Eggplant implements Vegetables { 	@Override	public void desc() {		// TODO Auto-generated method stub  System.out.println("我是茄子");	} }
public class Tomato implements Vegetables { 	@Override	public void desc() {		// TODO Auto-generated method stub   System.out.println("我是番茄");	} }
4.果蔬店和商品都有了,顧客就可以來買了。
public class Test { 	public static void main(String[] args) {				AbstractFactory factory = new FruitFactory();				Fruit fruit = factory.getFruit("apple");				fruit.desc();	}}

優點:當一個產品族中的多個物件被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的物件。

缺點:產品族擴充套件非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加程式碼,又要在具體的裡面加程式碼。

使用場景: 1、QQ 換面板,一整套一起換。 2、生成不同作業系統的程式。

注意事項:產品族難擴充套件,產品等級易擴充套件。

18
最新評論
  • 3本作者大大最好的一本小說,劇情讓人拍手叫好,連看三遍也不膩
  • 宮崎駿作品中受歡迎的10句經典語錄,句句溫暖人心,你喜歡哪句