上篇博客介紹了簡單工廠模式和工廠方法模式,此次介紹抽象工廠模式,抽象工廠模式和工廠方法模式的區別在於須要建立對象的複雜程度上。編程
抽象工廠模式是圍繞着一個超級工廠建立其餘工廠。這個超級工廠被稱爲其餘工廠的工廠,主要是爲了解決接口選擇問題。iphone
舉例說明:ide
仍是繼續上篇用戶使用手的例子,如今生產手機的工廠發現,不一樣的手機使用的配件也不相同,須要單獨的生產配件。例如iphonX使用的原深感攝像頭,以及OLED顯示屏,而iphone8使用的全新感光元件組成的攝像頭,以及視網膜高清顯示屏。這樣就須要經過每一個配件的配件工廠來提供相應的配件。爲了在寫代碼實例時取名稱簡單,暫且定義iphoneX使用的是A攝像頭和A顯示器,而iphone8使用的是B攝像頭和B感應器。spa
代碼實例以下:code
顯示器對象
/** * 顯示屏接口 */ public interface Display { }
/** * iphoneX顯示器 */ public class ADisplay implements Display { public ADisplay(){ System.out.println("##### 製造OLED顯示屏 #####"); } }
/** * iphone8顯示器 */ public class BDisplay implements Display { public BDisplay(){ System.out.println("##### 製造高清視網膜顯示器 #####"); } }
攝像頭blog
/** * 攝像頭接口 */ public interface Camera { }
/** * iphoneX攝像頭 */ public class ACamera implements Camera { public ACamera(){ System.out.println("##### 製造原深感攝像頭 #####"); } }
/** * iphone8攝像頭 */ public class BCamera implements Camera{ public BCamera(){ System.out.println("##### 製造搭配全新感光組件的攝像頭 #####"); } }
工廠類接口
/** * 抽象工廠類 */ public abstract class AbstractFactory { /** * 得到顯示屏 * @return */ public abstract Display getDisplay(); /** * 得到攝像頭 * @return */ public abstract Camera getCamera(); }
/** * iphoneX配件工廠類 */ public class IphoneXPartsFactory extends AbstractFactory{ /** * 得到顯示屏 * * @return */ @Override public Display getDisplay() { return new ADisplay(); } /** * 得到攝像頭 * * @return */ @Override public Camera getCamera() { return new ACamera(); } }
/** * iphone8配件工廠類 */ public class Iphone8PartsFactory extends AbstractFactory{ /** * 得到顯示屏 * * @return */ @Override public Display getDisplay() { return new BDisplay(); } /** * 得到攝像頭 * * @return */ @Override public Camera getCamera() { return new BCamera(); } }
用戶類ip
/** * 用戶類 */ public class Customer { /** * 製造配件 * @param af */ public static void madeIphone(AbstractFactory af){ //製造iphone的配件 af.getDisplay(); af.getCamera(); } public static void main(String[] args) { AbstractFactory iphonePartsFactory = new IphoneXPartsFactory(); //製造iPhoneX 的配件 madeIphone(iphonePartsFactory); iphonePartsFactory = new Iphone8PartsFactory(); //製造iPhone8 的配件 madeIphone(iphonePartsFactory); } }
運行結果:get
##### 製造OLED顯示屏 #####
##### 製造原深感攝像頭 #####
##### 製造高清視網膜顯示器 #####
##### 製造搭配全新感光組件的攝像頭 #####
工廠模式也是屬於建立模式,它是工廠方法模式的進一步推廣。在當一個子系統須要一些產品對象,而這些產品又屬於一個以上的產品等級結構,那麼爲了將消費這些產品對象的責任和建立這些產品對象的責任分割開來,這個時候就可使用抽象工廠模式了。這樣在使用產品的一方不要直接參與產品的建立工做,而只須要向一個公用的工廠接口請求所須要的產品。
工廠模式的關係類圖以下:
抽象工廠模式中的角色和工廠方法模式中的角色是同樣的,這裏就不介紹了,能夠看上一篇工廠方法模式的角色介紹。
客戶端使用抽象工廠來建立須要的對象,而客戶端根本就不知道具體的實現是誰,客戶端只是面向產品的接口編程而已。也就是說,客戶端從具體的產品實現中解耦出來了。
由於一個具體的工廠實現表明的是一個產品族,好比上面例子的從iphoneX的配件到iphone8的配件只須要切換一下具體工廠。
抽象工廠模式的缺點是不太容易擴展新的產品。若是須要給整個產品族添加一個新的產品,那麼久須要修改抽象工廠,這樣就會致使修改全部的工廠實現類。