抽象工廠

抽象工廠模式它從這些內部的工廠方法中獲得物件的具體型別，因為客戶端程式僅使用這些物件的通用介面。抽象工廠模式將一組物件的實現細節與他們的一般使用分離開來。舉個例子來說，比如一個抽象工廠類叫做codice_1。客戶端程式只需要知道得到的物件是“信件”或者“簡歷”，而不需要知道具體的主題，因此客戶端程式從抽象工廠codice_1中得到了codice_5或codice_7類的引用，而不是具體類的物件引用。“工廠”是建立產品的地方，其目的是將產品的建立與產品的使用分離。抽象工廠模式的目的，是將若干抽象產品的介面與不同主題產品的具體實現分離開。這樣就能在增加新的具體工廠的時候，不用修改引用抽象工廠的客戶端程式碼。使用抽象工廠模式，能夠在具體工廠變化的時候，不用修改使用工廠的客戶端程式碼，甚至是在執行時。然而，使用這種模式或者相似的設計模式，可能給編寫程式碼帶來不必要的複雜性和額外的工作。正確使用設計模式能夠抵消這樣的“額外工作”。定義.抽象工廠模式的實質是“提供介面，建立一系列相關或獨立的物件，而不指定這些物件的具體類。”使用.具體的工廠決定了建立物件的具體型別，而且工廠就是物件實際建立的地方。這樣，客戶端程式呼叫抽象工廠引用的方法，由具體工廠完成物件建立，然後客戶端程式得到的是抽象產品的引用。如此使客戶端程式碼與物件的建立分離開來。因為工廠僅僅返回一個抽象產品的引用工廠建立物件的具體型別。然而，工廠知道具體物件的型別；例如，工廠可能從配置檔案中讀取某種型別。這時，客戶端沒有必要指定具體型別，因為已經在配置檔案中指定了。通常，這意味著：結構.類圖.codice_24介面中的codice_25方法返回codice_26型別的物件。返回codice_26的哪種實現依賴於使用codice_24的哪種實現。需要注意的是，為了簡潔起見，以上類圖僅僅展示了建立一個型別物件的工廠。而在抽象工廠模式中，通常一個工廠能夠建立若干種不同型別的物件。程式碼舉例.假設我們有兩種產品介面 Button 和 Border ，每一種產品都支援多種系列，比如 Mac 系列和 Windows 系列。這樣每個系列的產品分別是 MacButton, WinButton, MacBorder, WinBorder 。為了可以在執行時刻建立一個系列的產品族，我們可以為每個系列的產品族建立一個工廠 MacFactory 和 WinFactory 。每個工廠都有兩個方法 CreateButton 和 CreateBorder 並返回對應的產品，可以將這兩個方法抽象成一個介面 AbstractFactory 。這樣在執行時刻我們可以選擇建立需要的產品系列。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:class WinFactory: public AbstractFactory {public:那麼客戶可以根據需要選擇 Mac 風格或者 Win 風格來建立 Button 或 BorderAbstractFactory* fac;switch (style) {case MAC:fac = new MacFactory;break;case WIN:fac = new WinFactory;break;Button* button = fac-&gt;CreateButton();Border* border = fac-&gt;CreateBorder();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 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-&gt;CreateButton();$factory-&gt;CreateBorder();Java.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();適用性.在以下情況可以考慮使用抽象工廠模式：