本文內容參考:
軟考 系統架構設計師系列知識點之設計模式(2)_系統架構設計師中考設計模式嗎-CSDN博客
https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/2361182
特此致謝!
Abstract Factory(抽象工廠)模式
1. 概述
抽象工廠模式(Abstract Factory Pattern)是一種常見的設計模式,隸屬于設計模式中的創建型模式,用于產品族的構建。
抽象工廠是所有形態的工廠模式中最為抽象和最具一般性的一種形態。此模式為一個產品家族提供了統一的創建接口。當需要這個產品家族的某一系列的時候,可以從抽象工廠中選出相對系的系列來創建一個具體的工廠類別。
抽象工廠是指當有多個抽象角色時使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體情況下,創建多個產品族中的產品對象。
工廠模式中的每一個形態都是針對一定問題的解決方案,工廠方法針對的是多個產品系列結構;而抽象工廠模式針對的是多個產品族結構,一個產品族內有多個產品系列。
2. 實現原理
抽象工廠模式相對于工廠方法模式來說,就是工廠方法模式是針對一個產品系列的,而抽象工廠模式是針對多個產品系列的,即工廠方法模式是一個產品系列一個工廠類,而抽象工廠模式是多個產品系列一個工廠類。在抽象工廠模式中,客戶端不再負責對象的創建,而是把這個責任丟給了具體的工廠類,客戶端只負責對對象的調用,從而明確了各個類的職責。并且當一系列相互關聯的產品被設計到一個工廠類里后,客戶端的調用將會變得非常簡單,而且,如果要更換這一系列的產品,則只需要更換一個工廠類即可。
如果客戶端需要創建一些產品結構,而這些產品結構又分別屬于不同的產品類別,則可以使用抽象工廠模式。抽象工廠模式中抽象工廠類負責定義創建對象的接口,具體這一系列對象的創建工作由實現抽象工廠的具體工廠類來完成。
3.?角色
抽象工廠模式中存在四種角色,分別是:抽象工廠角色(AbsractFactory),具體工廠角色(ConcereteFactory),抽象產品角色(AbstractProduct),具體產品角色(ConcreteProduct)。
- 抽象工廠角色
擔任這個角色的是工廠方法模式的核心,它是與應用系統商業邏輯無關的。
- 具體工廠角色
這個角色直接在客戶端的調用下創建產品的實例。這個角色含有選擇合適的產品對象的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。
- 抽象產品角色
擔任這個角色的類是工廠方法模式所創建的對象的父類,或它們共同擁有的接口。
- 具體產品角色
抽象工廠模式所創建的任何產品對象都是某一個具體產品類的實例。這是客戶端最終需要的東西,其內部一定充滿了應用系統的商業邏輯。
4.?功能
抽象工廠模式的一個主要功能是它能夠隔離要生成的具體產品類, 由于這些類的實際類名部被隱藏在工廠內部,因此客戶端根本不需要關心如何對它們進行實例化的細節。每種設計模式都是針對特定問題的解決方案,而抽象工廠模式面臨的問題則是當涉及到有多個產品等級結構寸,如何更好地進行軟件體系結構的設計。
5.?代碼舉例
假設有兩種產品接口Button和Border,每一種產品都支持多種系列,比如Mac系列和Windows系列。這樣每個系列的產品分別是MacButton、WinButton、MacBorder、WinBorder。為了可以在運行時刻創建一個系列的產品族,可以為每個系列的產品族創建一個工廠MacFactory和WinFactory 。每個工廠都有兩個方法CreateButton和CreateBorder并返回對應的產品,可以將這兩個方法抽象成一個接口AbstractFactory。這樣,在運行時刻我們可以選擇創建需要的產品系列。
- Java
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();}
}
- C++
class Button; // Abstract
Classclass MacButton: public Button {};
class WinButton: public Button {};
class Border; // Abstract
Classclass MacBorder: public Border {};
class WinBorder: public Border {};class AbstractFactory {public:virtual Button* CreateButton() =0;virtual Border* CreateBorder() =0;
};
class MacFactory: public AbstractFactory {public:MacButton* CreateButton() { return new MacButton; }MacBorder* CreateBorder() { return new MacBorder; }
};
class WinFactory: public AbstractFactory {public:WinButton* CreateButton() { return new WinButton; }WinBorder* CreateBorder() { return new WinBorder; }
}
6.?適用情況
在以下情況可以考慮使用抽象工廠模式:
- 一個系統要獨立于其產品的創建、組合和表示時。
- 一個系統要由多個產品系列中的一個來配置時。
- 需要強調一系列相關的產品對象的設計以便進行聯合使用時。
- 提供一個產品類庫,而只想顯示它們的接口而不是實現時。
?