是什麼?spa
怎麼用?code
原理是什麼?對象
在什麼狀況下用?blog
抽象工廠模式:接口
提供了一種方式,能夠將一組具備同一主題的單獨的工廠封裝起來。產品
提供接口,建立一系列相關或獨立的對象,而不指定這些對象的具體類。io
適用哪些狀況:class
一、一個系統要獨立於它產品的建立、表示和組合時原理
二、一個系統要由多個產品系列中的一個來配置時配置
三、提供一個產品的類庫,只想顯示它們的接口而不是實現時
原理:
好比一個抽象工廠類叫DocumentCreator,此類提供了建立若干種產品的接口,包括建立信件的createLetter(返回Letter對象)和建立簡歷的createResume(返回Resume對象)。
系統中的FancyDocumentCreator和ModernDocumentCreator是抽象工廠類的具體實現類,這兩個類分別實現了createLetter和createResume方法(FancyDocumentCreator類的createLetter返回類型是FancyLetter,createResume返回類型是FancyResume。ModernDocumentCreator類的createLetter返回類型是ModernLetter,createResume返回類型是ModernResume)。
客戶端建立「信件」或「簡歷」時,先要找一個合適的DocumentCreator對象,而後調用它的方法。
維基百科code例子:
假設咱們有兩種產品接口 Button 和 Border ,每一種產品都支持多種系列,好比 Mac 系列和 Windows 系列。這樣每一個系列的產品分別是 MacButton, WinButton, MacBorder, WinBorder 。爲了能夠在運行時刻建立一個系列的產品族,咱們能夠爲每一個系列的產品族建立一個工廠 MacFactory 和 WinFactory 。每一個工廠都有兩個方法 CreateButton 和 CreateBorder 並返回對應的產品,能夠將這兩個方法抽象成一個接口 AbstractFactory 。這樣在運行時刻咱們能夠選擇建立須要的產品系列。
一、定義接口
public interface Button {} public interface Border {}
二、實現抽象類
public class MacButton implements Button {} public class MacBorder implements Border {} public class WinButton implements Button {} public class WinBorder implements Border {}
三、實現工廠
public class MacFactory { public static Button createButton() { return new MacButton(); } public static Border createBorder() { return new MacBorder(); } }
public class WinFactory { public static Button createButton() { return new WinButton(); } public static Border createBorder() { return new WinBorder(); } }