一. 與工廠模式的區別
工廠模式:定義一個建立物件的介面,讓其子類自己決定例項化哪一個工廠類,工廠模式使其建立過程延遲到子類進行。
抽象工廠模式:提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。
關於抽象工廠,我是這樣理解的,抽象工廠更像是簡單工廠模式的高階版,簡單工廠模式只能生產一類產品的多個型號,而抽象工廠能生產不同類別的產品。舉個例子,一家水果店只賣蘋果,有紅富士,還有嘎啦果。如果想賣梨子,就得重新開一家水果店了(新建一個工廠類)。可能有人會有疑問,為什麼不重新裝修一下賣蘋果的店子,讓它也能賣梨子?事實是為了遵循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、生成不同作業系統的程式。
注意事項:產品族難擴充套件,產品等級易擴充套件。
最新評論