大白話工廠方法模式(Factory Method)一文中,咱們講解了日產4S店工廠規模的擴大,建立了針對不一樣車型的工廠,減小了工廠的工做內容,提升了效率。下面咱們繼續以4S店的故事討論抽象工廠模式。
爲了知足各個階層的客戶,日產公司推出了豪華系列品牌英菲尼迪,並且爲了吸引客戶購買,購車贈送行車記錄儀,購買日產汽車贈送日產行車記錄儀。購買英菲尼迪汽車贈送英菲尼迪行車記錄儀。php
經過上面的描述咱們引出產品族和等級結構的定義。
產品族:即來自一個家族,好比英菲尼迪汽車和英菲尼迪行車記錄儀都來自英菲尼迪家族,日產汽車和日產行車記錄儀都來自日產家族。
等級結構:能夠理解爲相同的產品,好比英菲尼迪汽車和日產汽車處於同一個等級結構,英菲尼迪行車記錄儀和日產行車記錄儀處於同一個等級結構。html
如今假設工廠分爲日產工廠和英菲尼迪工廠,且汽車和行車記錄儀都只有一種型號。日產工廠須要生產相同產品族的日產汽車和日產行車記錄儀。英菲尼迪工廠須要生產相同產品族的英菲尼迪汽車和英菲尼迪行車記錄儀。java
經過對比,發現和工廠方法模式的區別爲:
工廠方法模式針對的是一個產品等級結構,而抽象工廠模式則須要面對多個產品等級結構設計模式
代碼以下:
代碼片斷1 汽車父類ide
/** * 汽車的父類 * @author coderzcr */ public abstract class Car { String name; void printCar(){ System.out.println(name+"汽車已製造完成"); } }
代碼片斷2 日產汽車this
/** * 日產汽車 * @author coderzcr */ public class NissanCar extends Car { NissanCar(){ this.name = "日產"; } }
代碼片斷3 英菲尼迪汽車設計
/** * 英菲尼迪汽車 * @author coderzcr */ public class InfinitiCar extends Car { InfinitiCar(){ this.name = "英菲尼迪"; } }
代碼片斷4 行車記錄儀父類3d
/** * 行車記錄儀父類 * @author coderzcr */ public abstract class DVR { String name; void printDVR(){ System.out.println(name+"行車記錄儀已製造完成"); } }
代碼片斷5 日產行車記錄儀code
/** * 日產行車記錄儀 * @author coderzcr */ public class NissanDVR extends DVR{ NissanDVR(){ this.name = "日產"; } }
代碼片斷6 英菲尼迪行車記錄儀htm
/** * 英菲尼迪行車記錄儀 * @author coderzcr */ public class InfinitiDVR extends DVR { InfinitiDVR(){ this.name = "英菲尼迪"; } }
代碼片斷7 工廠父類
/** * 工廠父類 * @author coderzcr */ public abstract class AbstractFactory { abstract Car getCar(); abstract DVR getDVR(); }
代碼片斷8 日產工廠
/** * 日產工廠 * @author coderzcr */ public class NissanFactory extends AbstractFactory { @Override Car getCar() { return new NissanCar(); } @Override DVR getDVR() { return new NissanDVR(); } }
代碼片斷9 英菲尼迪工廠
/** * 英菲尼迪工廠 * @author coderzcr */ public class InfinitiFactory extends AbstractFactory { @Override Car getCar() { return new InfinitiCar(); } @Override DVR getDVR() { return new InfinitiDVR(); } }
圖1 類圖
抽象工廠模式(Abstract Factory Pattern):提供一個建立一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,屬於對象建立型模式。
圖2抽象工廠模式類圖
抽象工廠模式包含以下角色:
增長新的具體工廠和產品族很方便,無須修改已有系統,符合「開閉原則」。
開閉原則的傾斜性(增長新的工廠和產品族容易,增長新的產品等級結構麻煩)。