Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
java
爲建立一組相關或相互依賴的對象提供一個接口,而無需指定他們的具體類。設計模式
工廠模式的不足:類的建立依賴工廠類,也就是說,若是想要拓展程序,必須對工廠類進行修改,這違背了閉包原則。閉包
抽象工廠是工廠模式的升級版本,在有多個業務品種、業務分類時,經過抽象工廠模式產生須要的對象。ide
經過建立多個工廠類,這樣一旦須要增長新的功能,直接增長新的工廠類就能夠了,不須要修改以前的代碼。spa
工廠類的抽象類
操作系統
package AbstractFactory; public abstract class AbstractCreator { //建立A產品方法 public abstract AbstractProductA createProductA(); //建立B產品方法 public abstract AbstractProductB createProductB(); }
產品A的抽象類
設計
package AbstractFactory; public abstract class AbstractProductA { //產品A共有的方法 public void shareMethod(){ System.out.println("產品A共有的業務邏輯處理方法..."); } //產品A不一樣子產品不一樣實現 public abstract void doSomething(); }
產品B 的抽象類
code
package AbstractFactory; public abstract class AbstractProductB { //產品B共有的方法 public void shareMethod(){ System.out.println("產品B共有的業務邏輯處理方法..."); } //產品B不一樣子產品不一樣實現 public abstract void doSomething(); }
產品線1的工廠實現類
對象
package AbstractFactory; public class Creator1 extends AbstractCreator { @Override public AbstractProductA createProductA() { return new ProductA1(); } @Override public AbstractProductB createProductB() { return new ProductB1(); } }
產品線2的工廠實現類接口
package AbstractFactory; public class Creator2 extends AbstractCreator { @Override public AbstractProductA createProductA() { return new ProductA2(); } @Override public AbstractProductB createProductB() { return new ProductB2(); } }
產品A1
package AbstractFactory; public class ProductA1 extends AbstractProductA { @Override public void doSomething() { System.out.println("產品A1的業務邏輯處理方法..."); } }
產品A2
package AbstractFactory; public class ProductA2 extends AbstractProductA { @Override public void doSomething() { System.out.println("產品A2的業務邏輯處理方法..."); } }
產品B1
package AbstractFactory; public class ProductB1 extends AbstractProductB{ @Override public void doSomething() { System.out.println("B1的業務邏輯處理方法..."); } }
產品B2
package AbstractFactory; public class ProductB2 extends AbstractProductB{ @Override public void doSomething() { System.out.println("B2的業務邏輯處理方法..."); } }
1.良好的封裝性
2.產品族內的約束爲非公開狀態
產品族擴展很是困難,可能要修改抽象類或接口,違背開閉原則。
一個對象族(或者是一組沒有任何關係的對象)都有相同的約束,則能夠使用抽象工廠模式
例如:一個應用須要在三個不一樣平臺上運行,則能夠經過抽象工廠模式屏蔽掉操做系統對應用的影響,由不一樣的產品類去處理與操做系統交互的信息。
參考資料:
《設計模式之禪》 秦小波著
《JAVA設計模式》 蒐集整理來自互聯網