1. 意圖
提供一個介面以提供一系列相關或相互依賴的物件,而無須知道指定它們的具體的類
2. 別名
Kit
3. 動機
- 在軟體系統中經常面臨著一系列相互依賴的物件的創建作業;同時,由于需求變化,往往存在更多系列物件的創建作業
- 如何繞過常規的物件創建方法(new),提供一種封裝機制來避免客戶程式和這種多系列具體物件創建作業的緊耦合
4. 適用性
- 一個系統獨立于它的產品的創建、組合和表示
- 一個系統要由多個產品系列中的一個配置
- 要強調一系列相關產品物件的設計以便進行聯合使用
- 提供一個產品類別庫,但是只想顯示介面而不是實作
5. 結構

6. 效果
抽象工廠具有以下優點和缺點:
1) 分離了具體的類 客戶通過它們的抽象物件介面操縱實體,產品的類名也在具體工廠的實作中被隔離,即它們不出現在客戶代碼中
2) 易于交換產品系列 抽象工廠創建了完整的產品系列,只需要改變具體工廠即可使用不同產品的配置
3) 利于產品的統一性 當一個系列中的產品物件被設計成一起作業時,一個應用一次只能使用同一系列中的物件
4) 難以支持新種類的產品 抽象工廠介面確定了可以被創建的產品集合,支持新種類的產品就需要擴展該工廠介面,這將設計抽象工廠類及其子類的改變
7. 代碼實作
buttons: 第一個產品層次結構
Button.java
package abstract_factory; /** * @author GaoMing * @date 2021/7/17 - 15:37 * */ public interface Button { void paint(); }
MacOSButton.java
package abstract_factory;
/**
* @author GaoMing
* @date 2021/7/17 - 15:38
*/
public class MacOSButton implements Button{
@Override
public void paint(){
System.out.println("You have created MacOSButton.");
}
}
WindowsButton.java
package abstract_factory; /** * @author GaoMing * @date 2021/7/17 - 15:39 */ public class WindowsButton implements Button{ @Override public void paint(){ System.out.println("You have created WindowButton."); } }
Checkbox: 第二個產品結構
Checkbox.java
package abstract_factory; /** * @author GaoMing * @date 2021/7/17 - 15:40 */ public interface Checkbox { void paint(); }
MacOSCheckbox.java
package abstract_factory; /** * @author GaoMing * @date 2021/7/17 - 15:41 */ public class MacOSCheckbox implements Checkbox{ @Override public void paint(){ System.out.println("You have created MacOSCheckbox."); } }
WindowsCheckbox.java
package abstract_factory;
/**
* @author GaoMing
* @date 2021/7/17 - 15:42
*/
public class WindowsCheckbox implements Checkbox{
@Override
public void paint(){
System.out.println("You have created WindowCheckbox.");
}
}
Factories
GUIFactories.java: 抽象工廠
package abstract_factory.factories; import abstract_factory.Button; import abstract_factory.Checkbox; /** * @author GaoMing * @date 2021/7/17 - 15:43 */ public interface GUIFactory { Button createButton(); Checkbox createCheckbox(); }
MacOSFactory.java: 具體工廠 ( mac-OS)
package abstract_factory.factories; import abstract_factory.Button; import abstract_factory.Checkbox; import abstract_factory.MacOSButton; import abstract_factory.MacOSCheckbox; /** * @author GaoMing * @date 2021/7/17 - 15:46 */ public class MacOSFactory implements GUIFactory{ @Override public Button createButton(){ return new MacOSButton(); } @Override public Checkbox createCheckbox(){ return new MacOSCheckbox(); } }
WindowsFactory.java: 具體工廠 (Windows)
package abstract_factory.factories; import abstract_factory.Button; import abstract_factory.Checkbox; import abstract_factory.WindowsButton; import abstract_factory.WindowsCheckbox; /** * @author GaoMing * @date 2021/7/17 - 15:49 */ public class WindowsFactory implements GUIFactory{ @Override public Button createButton(){ return new WindowsButton(); } @Override public Checkbox createCheckbox(){ return new WindowsCheckbox(); } }
Application.java: 客戶端代碼
package abstract_factory; import abstract_factory.Button; import abstract_factory.Checkbox; import abstract_factory.factories.GUIFactory; /** * @author GaoMing * @date 2021/7/17 - 15:52 */ public class Application { private Button button; private Checkbox checkbox; public Application(GUIFactory factory){ button = factory.createButton(); checkbox = factory.createCheckbox(); } public void paint(){ button.paint(); checkbox.paint(); } }
Demo.java: 程式配置
package abstract_factory; import abstract_factory.factories.GUIFactory; import abstract_factory.factories.MacOSFactory; import abstract_factory.factories.WindowsFactory; import abstract_factory.Application; import java.util.Locale; /** * @author GaoMing * @date 2021/7/17 - 15:57 */ public class Demo { private static Application configureApplication(){ Application app; GUIFactory factory; String osName = System.getProperty("os.name").toLowerCase(); if(osName.contains("mac")){ factory = new MacOSFactory(); app = new Application(factory); }else{ factory = new WindowsFactory(); app = new Application(factory); } return app; } public static void main(String[] args){ Application app = configureApplication(); app.paint(); } }
運行結果
You create WindowsButton.
You created WindowsCheckbox.
8. 與其他模式的關系
- 一個應用中每個產品系列只需要一個ConcreteFactory的實體,可用Singleton實作
- 抽象工廠模式通常基于一組工廠方法, 但你也可以使用原型模式來生成這些類的方法
- Builder 重點關注如何分步生成復雜物件, 抽象工廠專門用于生產一系列相關物件, 抽象工廠會馬上回傳產品, 生成器則允許你在獲取產品前執行一些額外構造步驟
- 當只需對客戶端代碼隱藏子系統創建物件的方式時, 你可以使用抽象工廠來代替外觀模式
9. 已知應用
-
javax.xml.parsers.DocumentBuilderFactory#newInstance()
-
javax.xml.transform.TransformerFactory#newInstance()
-
javax.xml.xpath.XPathFactory#newInstance()
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/308455.html
標籤:設計模式
上一篇:策略模式(學習筆記)
下一篇:23種設計模式總結
