抽象工廠模式(Abstract Factory Pattern),屬於對象建立型模式。提供一個建立一系列相關或相互依賴(即一族)對象的接口,不須要指定它們具體的類。java
上圖中Phone和Computer屬於不一樣的產品等級結構,即產品的繼承結構。如一個抽象的手機,子類能夠是蘋果手機、聯想手機、小米手機,這樣抽象的手機和具體品牌的手機之間構成了一個產品等級結構,抽象手機做爲父類,品牌手機做爲子類。電腦的產品等級結構也是如此。git
而上圖中指出的產品族,簡單理解就是產品的家族。即由一個工廠生產的位於不一樣產品等級結構中的一組產品。上圖中iPhone是手機產品等級結構、MacBook是電腦產品等級結構,但都是蘋果公司一族的。github
1.當系統提供的工廠需生產的具體產品並非一個簡單的對象,而是多個位於不一樣產品等級結構中屬於不一樣類型的具體產品時。簡而言之,抽象工廠模式須要面對的是多個產品等級結構,而工廠方法模式針對的是一個產品等級結構。web
ProductA_Phone:產品A接口
ProductB_Computer :產品B接口
ConcreteProductA1_Iphone: 具體A類產品A1(實現產品A接口)
ConcreteProductA2_Lenove: 具體A類產品A2(實現產品A接口)
ConcreteProductA3_Xiaomi: 具體A類產品A3(實現產品A接口)
ConcreteProductB1_MacBook: 具體B類產品B1(實現產品B接口)
ConcreteProductB2_ThinkPad: 具體B類產品B2(實現產品B接口)
ConcreteProductB3_XiaomiAir :具體B類產品B3(實現產品B接口)
Factory :工廠接口
Factory1_Apple :具體Apple族工廠
Factory2_Lenove: 具體Lenove族工廠
Factory3_Xiaomi :具體Xiaomi族工廠sql
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; import java.util.logging.Logger; /** * 產品A 手機類 蘋果家族 ==> 蘋果手機 * @auther mynawang * @create 2016-12-29 10:41 */ public class ConcreteProductA1_Iphone implements ProductA_Phone{ private Logger logger = Logger.getLogger("ConcreteProductA1_Iphone_Log"); public ConcreteProductA1_Iphone() { logger.info("抽象工廠 ==> 蘋果手機被建立ConcreteProductA1_Iphone"); } }
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; import java.util.logging.Logger; /** * 產品A 手機類 聯想家族 ==> 聯想手機 * @auther mynawang * @create 2016-12-29 10:41 */ public class ConcreteProductA2_Lenove implements ProductA_Phone{ private Logger logger = Logger.getLogger("ConcreteProductA2_Lenove_Log"); public ConcreteProductA2_Lenove() { logger.info("抽象工廠 ==> 聯想手機被建立ConcreteProductA2_Lenove"); } }
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; import java.util.logging.Logger; /** * 產品A 手機類 小米家族 ==> 小米手機 * @auther mynawang * @create 2016-12-29 10:41 */ public class ConcreteProductA3_Xiaomi implements ProductA_Phone{ private Logger logger = Logger.getLogger("ConcreteProductA3_Xiaomi_Log"); public ConcreteProductA3_Xiaomi() { logger.info("抽象工廠 ==> 小米手機被建立ConcreteProductA3_Xiaomi"); } }
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; import java.util.logging.Logger; /** * 產品B 電腦類 蘋果家族 ==> 蘋果電腦 * @auther mynawang * @create 2016-12-29 10:42 */ public class ConcreteProductB1_MacBook implements ProductB_Computer { private Logger logger = Logger.getLogger("ConcreteProductB1_MacBook_Log"); public ConcreteProductB1_MacBook() { logger.info("抽象工廠 ==> 蘋果電腦被建立ConcreteProductB1_MacBook"); } }
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; import java.util.logging.Logger; /** * 產品B 電腦類 聯想家族 ==> 聯想電腦 * @auther mynawang * @create 2016-12-29 10:42 */ public class ConcreteProductB2_ThinkPad implements ProductB_Computer { private Logger logger = Logger.getLogger("ConcreteProductB2_ThinkPad_Log"); public ConcreteProductB2_ThinkPad() { logger.info("抽象工廠 ==> 聯想電腦ThinkPad被建立ConcreteProductB2_ThinkPad"); } }
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; import java.util.logging.Logger; /** * 產品B 電腦類 小米家族 ==> 小米電腦 * @auther mynawang * @create 2016-12-29 10:42 */ public class ConcreteProductB3_XiaomiAir implements ProductB_Computer { private Logger logger = Logger.getLogger("ConcreteProductB3_XiaomiAir_Log"); public ConcreteProductB3_XiaomiAir() { logger.info("抽象工廠 ==> 小米筆記本Air被建立ConcreteProductB3_XiaomiAir"); } }
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; /** * 抽象工廠(一組用於建立一族產品的方法,一個方法對應一類產品) * @auther mynawang * @create 2016-12-29 10:43 */ public interface Factory { ProductA_Phone createProductA(); ProductB_Computer createProductB(); }
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; /** * 具體工廠(蘋果公司工廠,用於生產蘋果家族的產品) * @auther mynawang * @create 2016-12-29 10:43 */ public class Factory1_Apple implements Factory{ @Override public ProductA_Phone createProductA() { return new ConcreteProductA1_Iphone(); } @Override public ProductB_Computer createProductB() { return new ConcreteProductB1_MacBook(); } }
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; /** * 具體工廠(聯想公司工廠,用於生產聯想家族的產品) * @auther mynawang * @create 2016-12-29 10:44 */ public class Factory2_Lenove implements Factory { @Override public ProductA_Phone createProductA() { return new ConcreteProductA2_Lenove(); } @Override public ProductB_Computer createProductB() { return new ConcreteProductB2_ThinkPad(); } }
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; /** * 具體工廠(小米公司工廠,用於生產小米家族的產品) * @auther mynawang * @create 2016-12-29 10:44 */ public class Factory3_Xiaomi implements Factory { @Override public ProductA_Phone createProductA() { return new ConcreteProductA3_Xiaomi(); } @Override public ProductB_Computer createProductB() { return new ConcreteProductB3_XiaomiAir(); } }
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; /** * 產品A(一類產品 手機)接口 * @auther mynawang * @create 2016-12-29 10:39 */ public interface ProductA_Phone { }
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern; /** * 產品B(一類產品 電腦)接口 * @auther mynawang * @create 2016-12-29 10:39 */ public interface ProductB_Computer { }
package com.sedion.mynawang; import com.sedion.mynawang.Chapter02_AbstractFactoryPattern.*; /** * 抽象工廠模式測試 * @auther mynawang * @create 2016-12-29 11:02 */ public class Chapter02_AbstractFactoryPattern_test { public static void main(String[] args) { Factory factory1 = new Factory1_Apple(); factory1.createProductA(); factory1.createProductB(); Factory factory2 = new Factory2_Lenove(); factory2.createProductA(); factory2.createProductB(); Factory factory3 = new Factory3_Xiaomi(); factory3.createProductA(); factory3.createProductB(); } }
// 打印結果 Connected to the target VM, address: '127.0.0.1:54302', transport: 'socket' 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductA1_Iphone <init> 信息: 抽象工廠 ==> 蘋果手機被建立ConcreteProductA1_Iphone 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductB1_MacBook <init> 信息: 抽象工廠 ==> 蘋果電腦被建立ConcreteProductB1_MacBook 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductA2_Lenove <init> 信息: 抽象工廠 ==> 聯想手機被建立ConcreteProductA2_Lenove 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductB2_ThinkPad <init> Disconnected from the target VM, address: '127.0.0.1:54302', transport: 'socket' 信息: 抽象工廠 ==> 聯想電腦ThinkPad被建立ConcreteProductB2_ThinkPad 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductA3_Xiaomi <init> 信息: 抽象工廠 ==> 小米手機被建立ConcreteProductA3_Xiaomi 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductB3_XiaomiAir <init> 信息: 抽象工廠 ==> 小米筆記本Air被建立ConcreteProductB3_XiaomiAir Process finished with exit code 0
1.增長新的具體工廠和產品族很方便,無需修改功能,只要新加相應的產品族便可,符合「開閉原則」。編程
2.全部具體工廠都實現了抽象工廠中定義的公共接口,所以只需改變具體工廠的實例,就能夠在某種程度上改變整個軟件系統的行爲。socket
當增長新的產品等級結構(產品種類)時很麻煩,須要調整抽象類以及全部的具體實現類,會帶來很大的不便。具備開閉原則的傾斜性。ide
java.util.Calendar#getInstance() java.util.Arrays#asList() java.sql.DriverManager#getConnection() java.sql.Connection#createStatement() java.sql.Statement#executeQuery()
本人20有餘,天資愚鈍,深信勤能補拙。酷愛編程,愛鑽研,廣交碼友,耕於三線,日以繼夜而使飛燕之身蛻變爲大腹便便。spa
有志之士點擊連接加入技術交流羣【專一的程序猿】282087535
文章若是對你有所幫助是個人榮幸,不妥之處但願指正,轉帖請註明本文出自鈺火的小棧(http://www.mynawang.com/),請尊重他人的辛勤勞動成果,謝謝!