1. 意圖
提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
2. 別名
Kit
3. 動機
假設咱們要開發一款遊戲,固然爲了吸引更多的人玩,遊戲難度不能太大 (讓你們都沒有信心了,估計遊戲也就沒有前途了),可是也不能太簡單 (沒有挑戰性也不符合玩家的心理)。因而咱們就能夠採用這樣一種處理策略:爲遊戲設立等級,初級、中級、高級甚至有BT 級。假設也是過關的遊戲,每一個關卡都有一些怪物 (monster)守着,玩家要把這些怪物幹掉才能夠過關。做爲開發者,咱們就不得不建立怪物的類,而後初級怪物、中級怪物等都繼承自怪物類(固然不一樣種類的則須要另建立類,可是模式相同)。在每一個關卡,咱們都要建立怪物的實例,例如初級就建立初級怪物(有不少種類)、中級建立中級怪物等。能夠想象在這個系統中,將會有成千上萬的怪物實例要建立,問題是還要保證建立的時候不會出錯:初級不能建立 BT 級的怪物(玩家就鬱悶了,玩家一鬱悶,遊戲也就掛掛了),反之也不能夠。
AbstractFactory 模式就是用來解決這類問題的:要建立一組相關或者相互依賴的對象。 ios
②一個系統要由多個產品系列中的一個來配置時。
③當你要強調一系列相關的產品對象的設計以便進行聯合使用時。
④當你提供一個產品類庫,而只想顯示它們的接口而不是實現時。web
②Concreteactory(MotifWidgetFactory,PMWidgetFactory):實現建立具體產品對象的操做。
③AbstractProduct(Windows,ScrollBar):爲一類產品對象聲明一個接口。
④ConcreteProduct(MotifWindow,MotifScrollBar):定義一個將被相應的具體工廠建立的產品對象;實現AbstractProduct接口。
⑤Client:僅使用由AbstractFactory和AbstractProduct類聲明的接口。設計模式
#include<iostream> class AbstractProductA{ public: virtual ~ AbstractProductA(){} protected: AbstractProductA(){} }; class AbstractProductB{ public: virtual ~ AbstractProductB(){} protected: AbstractProductB(){} }; class ProductA1:public AbstractProductA{ public: ProductA1(){std::cout<< "ProductA1..."<<std::endl;} }; class ProductA2:public AbstractProductA{ public: ProductA2(){std::cout<< "ProductA2..."<<std::endl;} }; class ProductB1:public AbstractProductB{ public: ProductB1(){std::cout<< "ProductB1..."<<std::endl;} }; class ProductB2:public AbstractProductB{ public: ProductB2(){std::cout<< "ProductB2..."<<std::endl;} }; class AbstractFactory{ public: virtual ~AbstractFactory(){} virtual AbstractProductA* CreateProductA()=0; virtual AbstractProductB* CreateProductB()=0; protected: AbstractFactory(){} }; class ConcreteFactory1:public AbstractFactory{ public: AbstractProductA* CreateProductA(){ return new ProductA1();} AbstractProductB* CreateProductB(){ return new ProductB1();} }; class ConcreteFactory2:public AbstractFactory{ public: AbstractProductA* CreateProductA(){ return new ProductA2();} AbstractProductB* CreateProductB(){ return new ProductB2();} }; int main(){ AbstractFactory * cf1 = new ConcreteFactory1(); cf1->CreateProductA(); cf1->CreateProductB(); AbstractFactory * cf2 = new ConcreteFactory2(); cf2->CreateProductA(); cf2->CreateProductB(); }