這篇說說工廠的最後一種,還是先上 抽象工廠模式定義(來自百度百科): 抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個介面,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。根據 ...
這篇說說工廠的最後一種,還是先上
抽象工廠模式定義(來自百度百科):
抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。
抽象工廠模式可以向客戶端提供一個介面,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。根據里氏替換原則,
任何接受父類型的地方,都應當能夠接受子類型。因此,實際上系統所需要的,僅僅是類型與這些抽象產品角色相同的一些實例,而不是這些抽象產品的實例。
換言之,也就是這些抽象產品的具體子類的實例。工廠類負責創建抽象產品的具體子類的實例。
UML 類圖
具體代碼:
public class Client { public static void main(String[] args) { // Creator benzCreator = new BenzCreator(); // benzCreator.createCar().run(); // // Creator bmwCreator = new BmwCreator(); // bmwCreator.createCar().run(); AbstractFactory factory1 = new Factory1(); factory1.createProductA().getProductAName(); factory1.createProductB().getProductBName(); AbstractFactory factory2 = new Factory2(); factory2.createProductA().getProductAName(); factory2.createProductB().getProductBName(); } } public interface AbstractFactory { AbstractProductA createProductA(); AbstractProductB createProductB(); } public class Factory1 implements AbstractFactory { @Override public AbstractProductA createProductA() { return new ProductA1(); } @Override public AbstractProductB createProductB() { return new ProductB1(); } } public class Factory2 implements AbstractFactory { @Override public AbstractProductA createProductA() { return new ProductA2(); } @Override public AbstractProductB createProductB() { return new ProductB2(); } } public interface AbstractProductA { String getProductAName(); } public class ProductA1 implements AbstractProductA { ProductA1(){ System.out.println("產品A1"); } @Override public String getProductAName() { return "產品A1名稱"; } } public class ProductA2 implements AbstractProductA { ProductA2(){ System.out.println("產品A2"); } @Override public String getProductAName() { return "產品A2名稱"; } } public interface AbstractProductB { String getProductBName(); } public class ProductB1 implements AbstractProductB { ProductB1(){ System.out.println("產品B1"); } @Override public String getProductBName() { return "產品B1名稱"; } } public class ProductB2 implements AbstractProductB { ProductB2(){ System.out.println("產品B2"); } @Override public String getProductBName() { return "產品B2名稱"; } }
產品族:
是指位於不同產品等級結構中,功能相關聯的產品組成的家族
具體例子:
我舉個可能不大恰當的例子
例如我們電腦都是 32和64位的 對應的機器安裝對應位數的軟體
兩張光碟 分別存儲32位和64位的軟體 那裝機的時候 只需要拿一張光碟就搞定的整機軟體安裝 不用挨個軟體去找。
這裡 光碟就是具體的工廠 如果每張光碟都有QQ和360(就是要打架 怎樣?)
這裡32位的光碟 就是上面代碼里的Factory1 這裡64位的光碟 就是上面代碼里的Factory2
32位的光碟里的QQ就是ProductA1,360就是ProductB1
64位的光碟里的QQ就是ProductA2,360就是ProductB2
對於我這小白用戶,拿對光碟就行了,不需要既找對QQ的位數又找到360的位數,是不是很爽。
優缺點
優點:
分離介面和實現,這樣客戶端不需要知道具體的實現。
產品族的切換變得容易,就像如果出現128位的機器,無非多加一張光碟。
缺點:
不容易擴展新產品(想象一下增加一個產品要加多少類和方法吧)。
類的層級結構複雜(看看類圖都是想吐的有木有)
本質:
之前說過工廠方法的本質就是選擇實現,就是選擇具體的產品
那抽象工廠就是選擇產品族,由單一產品變成產品族而已。
三種工廠模式說完了,他們之間的聯繫區別和演化過程就先挖個坑,之後再寫。