爲建立一組相關或相互依賴的對象提供一個接口,並且無需指定它們的具體類。java
以女媧造人爲例,定義人種(Product產品類)及八卦爐(工廠類)。爲人類定義膚色及性別屬性,從設計角度看,一個具體的對象能夠經過膚色及性別肯定。生產的工廠類若是隻有一個,生產出來的全都是男性或者女性,所以須要拆分爲兩個工具類。windows
人類接口編輯器
public interface Human { // 每一個人都有膚色 void getColor(); // 每一個人都有性別 void getSex(); }
抽象人種類(根據膚色劃分)工具
/* * 白色人種 */ public abstract class AbstractWhiteHuman implements Human { public void getColor() { System.out.println("白色人種皮膚是白色的") } } /* * 黑色人種 */ public abstract class AbstractBlackHuman implements Human { public void getColor() { System.out.println("黑色人種皮膚是黑色的") } } /* * 黃色人種 */ public abstract class AbstractYellowHuman implements Human { public void getColor() { System.out.println("黃色人種皮膚是黃色的") } }
具體人類(產品類實現類),每一個抽象類都有兩個實現類(男人和女人),實現性別的定義,以黃色人種爲例操作系統
public class FemaleYellowHuman extends AbstractYellowHuman { public void getSex() { System.out.println("女性黃種人") } } public class MaleYellowHuman extends AbstractYellowHuman { public void getSex() { System.out.println("男性黃種人") } }
其它的黑色人種與白色人種的代碼與此相似,再也不重複編寫。到此全部的人種(產品類)已定義完畢,接下來須要定義八卦爐(工廠類)生產人類。設計
八卦爐接口unix
public interface HumanFactory { Human createYelloHuman(); Human createBlackHuman(); Human createWhiteHuman(); }
具體八卦爐(工廠實現類),按性別分爲男性八卦爐及女性八卦爐code
public class FemaleFactory implements HumanFactory { public Human createYelloHuman() { return new FemaleYelloHuman(); } public Human createBlackHuman() { return new FemaleBlackHuman(); } public Human createWhiteHuman() { return new FemaleWhiteHuman(); } } public class MaleFactory implements HumanFactory { public Human createYelloHuman() { return new MaleYelloHuman(); } public Human createBlackHuman() { return new MaleBlackHuman(); } public Human createWhiteHuman() { return new MaleWhiteHuman(); } }
造人(場景類)視頻
public class Client { public static void main(String[] args) { HumanFactory maleHumanFactory = new MaleFactory(); HumanFactory femaleHumanFactory = new FemaleFactory(); Human maleYellowHuman = maleHumanFactory.createYelloHuman(); Human maleBlackHuman = maleHumanFactory.createBlackHuman(); Human maleWhiteHuman = maleHumanFactory.createWhiteHuman(); Human femaleYellowHuman = femaleHumanFactory.createYelloHuman(); Human femaleBlackHuman = femaleHumanFactory.createBlackHuman(); Human femaleWhiteHuman = femaleHumanFactory.createWhiteHuman(); } }
抽象工廠模式是工廠方法模式的升級,在有多個業務品種,業務分類時,經過抽象工廠模式產生須要的對象。若是將八卦爐(工廠類)比喻爲車間,那八卦爐的類型(人種性別)能夠稱做產品等級,八卦爐的生產工藝(人種膚色)能夠稱做產品線或產品族。抽象工廠類的職責是定義每一個工廠要實現的功能即產品線,有M個產品等級就應該有M個八卦爐(工廠實現類),有N個產品線,在八卦爐(抽象工廠類)中就應該有N個生產線(建立方法)。在場景類中,沒有任何一個方法與產品實現類有關係,對於一個產品來講,只須要知道它的工廠方法就能夠直接生產一個產品對象,無需關心它的實現類。對象
一組沒有任何關係的對象具備相同的約束,則可使用抽象工廠模式。一個視頻編輯器及音頻編輯器,在unix和windows操做系統中雖然功能和界面都相同,但代碼的實現不一樣。也就是所說的具備共同的約束條件(操做系統)。所以可以使用抽象工廠模式,產生不一樣操做系統下的視頻及音頻處理器。
在抽象工廠模式的缺點中所說的是產品族擴展困難,而不是產品等級擴展困難。擴展產品等級只須要增長一個新的工廠實現類便可,也就是橫向擴展容易,縱向擴展困難。