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