-
抽象工廠模式
鎖定
- 中文名
- 抽象工廠模式
- 外文名
- Abstract Factory
- 是 指
- 當有多個抽象角色
- 根 據
- LSP原則
- 創 建
- 多個產品族中的產品對象
抽象工廠模式實現原理
抽象工廠模式相對於工廠方法模式來説,就是工廠方法模式是針對一個產品系列的,而抽象工廠模式是針對多個產品系列的,即工廠方法模式是一個產品系列一個工廠類,而抽象工廠模式是多個產品系列一個工廠類。在抽象工廠模式中,客户端不再負責對象的創建,而是把這個責任丟給了具體的工廠類,客户端只負責對對象的調用,從而明確了各個類的職責。並且當一系列相互關聯的產品被設計到一個工廠類裏後,客户端的調用將會變得非常簡單,而且,如果要更換這一系列的產品,則只需要更換一個工廠類即可。
[2]
如果客户端需要創建一些產品結構,而這些產品結構又分別屬於不同的產品類別,則可以使用抽象工廠模式,抽象工廠模式中抽象工廠類負責定義創建對象的接口,具體這一系列對象的創建工作由實現抽象工廠的具體工廠類來完成。
[2]
抽象工廠模式角色
抽象工廠模式功能
抽象工廠模式的一個主要功能是它能夠隔離要生成的具體產品類, 由於這些類的實際類名部被隱藏在工廠內部,因此客户端根本不需要關心如何對它們進行實例化的細節。每種設計模式都是針對特定問題的解決方案,而抽象工廠模式面臨的問題則是當涉及到有多個產品等級結構寸,如何更好地進行軟件體系結構的設計。
[4]
抽象工廠模式代碼舉例
假設我們有兩種產品接口 Button 和 Border ,每一種產品都支持多種系列,比如 Mac 系列和 Windows 系列。這樣每個系列的產品分別是 MacButton, WinButton, MacBorder, WinBorder 。為了可以在運行時刻創建一個系列的產品族,我們可以為每個系列的產品族創建一個工廠 MacFactory 和 WinFactory 。每個工廠都有兩個方法 CreateButton 和 CreateBorder 並返回對應的產品,可以將這兩個方法抽象成一個接口 AbstractFactory 。這樣在運行時刻我們可以選擇創建需要的產品系列。
[5]
抽象工廠模式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; }};
那麼客户可以根據需要選擇 Mac 風格或者 Win 風格來創建 Button 或 Border
AbstractFactory* fac;switch (style) {case MAC: fac = new MacFactory; break;case WIN: fac = new WinFactory; break;}Button* button = fac->CreateButton(); Border* border = fac->CreateBorder();
抽象工廠模式PHP
<?php/*************************************************************************** * AbstractFactory.php * ------------------- * Time : 2006-11-11 * Coder : rollenc(http://www.rollenc.com) * syre(http://syre.blogbus.com) ***************************************************************************/abstract class AbstractFactory { abstract public function CreateButton(); abstract public function CreateBorder();}class MacFactory extends AbstractFactory{ public function CreateButton() { return new MacButton(); } public function CreateBorder() { return new MacBorder(); }}class WinFactory extends AbstractFactory{ public function CreateButton() { return new WinButton(); } public function CreateBorder() { return new WinBorder(); }}class Button{}class Border{}class MacButton extends Button{ function __construct() { echo 'MacButton is created' . "\n"; }}class MacBorder extends Border{ function __construct() { echo 'MacBorder is created' . "\n"; }}class WinButton extends Button{ function __construct() { echo 'WinButton is created' . "\n"; }}class WinBorder extends Border{ function __construct() { echo 'WinBorder is created' . "\n"; }}?>
那麼客户可以根據需要選擇 Mac 風格或者 Win 風格的 Button 或 Border 來創建
<?$type = 'Mac'; //value by user. if(!in_array($type, array('Win','Mac'))) die('Type Error'); $factoryClass = $type.'Factory'; $factory=new $factoryClass; $factory->CreateButton(); $factory->CreateBorder();
抽象工廠模式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(); }}
抽象工廠模式適用情況
抽象工廠模式優缺點
抽象工廠模式優點
抽象工廠模式缺點
- 參考資料
-
- 1. 温立輝主編.Java EE編程技術:北京理工大學出版社,2016.01:第206頁
- 2. 郭峯著.深入淺出設計模式:中國鐵道出版社,2013.01:第79頁
- 3. 沙基昌主編.軟件開發中級編程指南:國防科技大學出版社,2008.09:第243頁
- 4. 黃永忠 陳新 陳海勇 劉蓬暉 王磊 周蓓編著.面向對象方法與技術基礎:國防工業出版社,2006年05月第1版:第318頁
- 5. 陳華恩. JAVA設計模式研究之抽象工廠模式[J]. 電腦知識與技術, 2010, 6(9):2245-2246.
- 6. 徐瀟,李遠編著.MATLAB面向對象編程 從入門到設計模式:北京航空航天大學出版社,2015.01:第247頁