抽象工厂模式AbstractFactory
簡介
抽象工廠模式(Abstract Factory Pattern):提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱為Kit模式,屬于對象創(chuàng)建型模式。
不同點(diǎn)
為了更清晰地理解抽象工廠模式,需要先引入兩個概念:
產(chǎn)品等級結(jié)構(gòu) :產(chǎn)品等級結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu),如一個抽象類是CPU,其子類有intelcpu、amdcpu,則抽象cpu與具體品牌的cpu之間構(gòu)成了一個產(chǎn)品等級結(jié)構(gòu),抽象cpu是父類,而具體品牌的cpu是其子類。
產(chǎn)品族 :在抽象工廠模式中,產(chǎn)品族是指由同一個工廠生產(chǎn)的,位于不同產(chǎn)品等級結(jié)構(gòu)中的一組產(chǎn)品,如intel工廠生產(chǎn)的intelcpu、intel主板,intelcpu位于cpu產(chǎn)品等級結(jié)構(gòu)中,intel主板位于主板產(chǎn)品等級結(jié)構(gòu)中。
?
?
在工廠方法模式中具體工廠負(fù)責(zé)生產(chǎn)具體的產(chǎn)品,每一個具體工廠對應(yīng)一種具體產(chǎn)品,工廠方法也具有唯一性,一般情況下,一個具體工廠中只有一個工廠方法或者一組重載的工廠方法。但是有時候我們需要一個工廠可以提供多個產(chǎn)品對象,而不是單一的產(chǎn)品對象。
?
?
當(dāng)系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個簡單的對象,而是多個位于不同產(chǎn)品等級結(jié)構(gòu)中屬于不同類型的具體產(chǎn)品時需要使用抽象工廠模式。
抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)。
抽象工廠模式與工廠方法模式最大的區(qū)別在于,工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu),而抽象工廠模式則需要面對多個產(chǎn)品等級結(jié)構(gòu),一個工廠等級結(jié)構(gòu)可以負(fù)責(zé)多個不同產(chǎn)品等級結(jié)構(gòu)中的產(chǎn)品對象的創(chuàng)建 。當(dāng)一個工廠等級結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級結(jié)構(gòu)的一個產(chǎn)品族中的所有對象時,抽象工廠模式比工廠方法模式更為簡單、有效率。
?
類圖
?
源碼
cpu
public interface CPU {public void calculate(); }
?
intelcpu
public class IntelCPU implements CPU {private Integer pins;//cpu腳針數(shù)public IntelCPU(Integer pins) {this.pins = pins;}public void calculate() {System.out.println("Intel CPU 腳針數(shù):" + pins);} }
?
amdcpu
public class AMDCPU implements CPU {private Integer pins;//cpu腳針數(shù)public AMDCPU(Integer pins) {this.pins = pins;}public void calculate() {System.out.println("AMD CPU 腳針數(shù):" + pins);} }
?
主板
public interface MainBoard {public void installCPU(); }
?
intel主板
public class IntelMainBoard implements MainBoard {private Integer pins;public IntelMainBoard(Integer pins) {this.pins = pins;}public void installCPU() {System.out.println("Intel MainBoard 針腳數(shù):"+pins);} }
?
amd主板
public class AMDMainBoard implements MainBoard {private Integer pins;public AMDMainBoard(Integer pins) {this.pins = pins;}public void installCPU() {System.out.println("AMD MainBoard 針腳數(shù):" + pins);} }
?
工廠
public interface AbstractFactory {public CPU buyCPU();public MainBoard buyMainBoard();}
?
intel工廠
public class IntelFactory implements AbstractFactory {public CPU buyCPU() {return new IntelCPU(555);}public MainBoard buyMainBoard() {return new IntelMainBoard(555);} }
?
amd工廠
public class AMDFactory implements AbstractFactory {public CPU buyCPU() {return new IntelCPU(666);}public MainBoard buyMainBoard() {return new IntelMainBoard(666);} }
?
商家
public class Store {private CPU cpu = null;private MainBoard mainBoard = null;//組裝pcpublic void setupPC(AbstractFactory factory) {this.cpu = factory.buyCPU();//買cputhis.mainBoard = factory.buyMainBoard();//買主板//買內(nèi)存 機(jī)箱...this.cpu.calculate();this.mainBoard.installCPU();} }
?
測試
public static void main(String[] args) {Store store = new Store();AbstractFactory intelModel = new IntelFactory();store.setupPC(intelModel);//intel型號的電腦 /* Intel CPU 腳針數(shù):555Intel MainBoard 針腳數(shù):555*/}
?
適用場景
- 一個系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié),這對于所有形態(tài)的工廠模式都是重要的。
- 這個系統(tǒng)的產(chǎn)品有多于一個的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品。
- 同屬于同一個產(chǎn)品族的產(chǎn)品是在一起使用的,這一約束必須在系統(tǒng)的設(shè)計中體現(xiàn)出來。(比如:Intel主板必須使用Intel CPU、Intel
芯片組)
- 系統(tǒng)提供一個產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于實現(xiàn)。
優(yōu)點(diǎn)
- 分離接口和實現(xiàn):客戶端使用抽象工廠來創(chuàng)建需要的對象,而客戶端根本就不知道具體的實現(xiàn)是誰,客戶端只是面向產(chǎn)品的接口編程而已。也就是說,客戶端從具體的產(chǎn)品實現(xiàn)中解耦。
- 使切換和添加產(chǎn)品族變得容易:因為一個具體的工廠實現(xiàn)代表的是一個產(chǎn)品族,比如上面例子的從Intel系列到AMD系列只需要切換一下具體工廠。我也可以再添加一個新的裝機(jī)方案,一個新的產(chǎn)品族,都是很方便的。
缺點(diǎn)
不容易擴(kuò)展新的產(chǎn)品等級,比如我要加一個硬盤、內(nèi)存什么的。那么就需要修改抽象工廠,這樣就會導(dǎo)致修改所有的工廠實現(xiàn)類。
?
Head First 設(shè)計模式(中文版)的示例:
碼云地址:https://gitee.com/manusas/FactoryDP
?
我只是大自然的搬運(yùn)工(thx):
hxxp://blog.csdn.net/zhshulin/article/details/38349211
hxxp://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html
轉(zhuǎn)載于:https://www.cnblogs.com/manusas/p/7489893.html
總結(jié)
以上是生活随笔為你收集整理的抽象工厂模式AbstractFactory的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 喇叭喇叭喇叭是什么歌呢
- 下一篇: __bridge 使用注意