在瞭解抽象工廠模式以前,首先來了解一下兩個術語:java
產品等級結構也就是產品的繼承結構,例如一個抽象類是電視機,子類有不一樣品牌的電視機,好比海爾電視機,海信電視機,TCL電視機,而抽象電視機與具體品牌的電視機之間構成了一個產品等級結構,抽象電視機是父類,而具體品牌的電視機是子類。ide
產品族是指由一個同一個工廠產生的位於不一樣產品等級結構中的一組產品,例如海爾電器工廠生產的海爾電視機,海爾電冰箱。海爾電視機位於電視機產品等級結構中,海爾電冰箱位於電冰箱產品等級結構中,海爾電視機與海爾電冰箱共同構成了一個產品族。測試
二者示意圖以下:設計
抽象工廠模式:提供一個建立一系列相關或相互依賴對象的接口,而無須指定它們具體的類。
抽象工廠模式又叫Kit模式,是一種對象建立型模式。3d
結構圖以下:
code
抽象工廠模式包含四個角色:對象
界面皮膚庫設計:開發一套皮膚庫,用戶能夠經過菜單選擇皮膚,不一樣的皮膚提供視覺不一樣的按鈕,文本框等UI元素。blog
這裏簡單起見假設開發兩套皮膚:繼承
每套皮膚具備如下UI元素:接口
首先是UI元素,包括抽象元素以及具體元素:
interface Button { void display(); } class SpringButton implements Button { public void display() { System.out.println("春季皮膚按鈕"); } } class SummerButton implements Button { public void display() { System.out.println("夏季皮膚按鈕"); } } interface TextField { void display(); } class SpringTextField implements TextField { public void display() { System.out.println("春季皮膚文本框"); } } class SummerTextField implements TextField { public void display() { System.out.println("夏季皮膚文本框"); } } interface ComboBox { void display(); } class SpringComboBox implements ComboBox { public void display() { System.out.println("春季皮膚組合框"); } } class SummerComboBox implements ComboBox { public void display() { System.out.println("夏季皮膚組合框"); } }
接着是工廠類,包括抽象工廠以及具體工廠:
interface SkinFactory { Button createButton(); TextField createTextField(); ComboBox createComboBox(); } class SpringSkinFactory implements SkinFactory { public Button createButton() { return new SpringButton(); } public TextField createTextField() { return new SpringTextField(); } public ComboBox createComboBox() { return new SpringComboBox(); } } class SummerSkinFactory implements SkinFactory { public Button createButton() { return new SummerButton(); } public TextField createTextField() { return new SummerTextField(); } public ComboBox createComboBox() { return new SummerComboBox(); } }
測試:
public class Test { public static void main(String[] args) { SkinFactory factory = new SpringSkinFactory(); factory.createButton().display(); factory.createTextField().display(); factory.createComboBox().display(); factory = new SummerSkinFactory(); factory.createButton().display(); factory.createTextField().display(); factory.createComboBox().display(); } }
雖然使用抽象工廠模式增長新的皮膚界面很是方便,可是若是增長一個UI元素,會修改大量的代碼,須要修改抽象工廠以及每個具體工廠類,也就是說,不可以在符合OCP(開放閉合原則)的前提下增長新的組件。
這是抽象工廠模式的最大缺點,儘管增長新的產品族(這裏是皮膚)很是方便,可是增長新的產品等級結構(這裏是UI元素)很麻煩。抽象工廠模式的這種性質叫作開閉原則的傾斜性。所以設計人員在設計之初須要全面考慮,不然新增產品結構會致使大量的代碼修改。
主要缺點是增長新的產品等級結構麻煩,須要對系統進行大量的修改,違背了OCP