設計模式 -- 抽象原廠模式(AbstactFactory)
抽象原廠模式
抽象原廠模式其實是通過原廠模式實現的,也可以說是原廠模式的擴充。那什麼是抽象原廠模式呢?好,先來看看這樣一個問題:假設我們玩一個橫版過關的遊戲,當前關卡有好幾類怪物(如:精靈類,人族,鬼…),每類怪物都有好幾十隻,那麼這種情境對象的建立我們也應該像原廠模式一樣把其封裝起來管理。抽象原廠模式和原廠模式的區別就是,抽象工廠類是管理一組基類對象,而工廠類只是管理一類基類對象。下面再來看看其結構樣本圖:
總結:概括地講,原廠模式和抽象原廠模式都是用來管理對象建立(new)而封裝的。而他們的唯一區別就是一個只是管理一類對象的建立,另一個是管理一組對象的建立。<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxoMiBpZD0="樣本">樣本
假設有這樣一個關卡,包括2種怪物:A類怪和B類怪(一組類對象)。同時這個關卡有兩種難度選擇:初級和中級(2個工廠類)。下面是這個關卡怪物建立的範例程式碼:
A類,B類怪物
#ifndef __DesignMode__Product__#define __DesignMode__Product__//A類怪物基類class AbstractProductA{public: virtual ~AbstractProductA();protected: AbstractProductA();};//B類怪物基類class AbstractProductB{public: virtual ~AbstractProductB();protected: AbstractProductB();};//初級A類怪物class ProductA1:public AbstractProductA{public: ProductA1(); ~ProductA1();};//中級A類怪物class ProductA2:public AbstractProductA{public: ProductA2(); ~ProductA2();};//初級B類怪物class ProductB1:public AbstractProductB{public: ProductB1(); ~ProductB1();};//中級B類怪物class ProductB2:public AbstractProductB{public: ProductB2(); ~ProductB2();};#endif
#include Product.h#include using namespace std;AbstractProductA::AbstractProductA(){}AbstractProductA::~AbstractProductA(){}AbstractProductB::AbstractProductB(){}AbstractProductB::~AbstractProductB(){}ProductA1::ProductA1(){ cout << 初級A類怪物... << endl;}ProductA1::~ProductA1(){}ProductA2::ProductA2(){ cout << 中級A類怪物... << endl;}ProductA2::~ProductA2(){}ProductB1::ProductB1(){ cout << 初級B類怪物... << endl;}ProductB1::~ProductB1(){}ProductB2::ProductB2(){ cout << 中級B類怪物... << endl;}ProductB2::~ProductB2(){}
工廠(基類):建立初級怪物工廠和建立中級怪物工廠(衍生類別)
#ifndef __DesignMode__Factory__#define __DesignMode__Factory__class AbstractProductA;class AbstractProductB;//抽象工廠基類class AbstractFactory{public: virtual ~AbstractFactory(); virtual AbstractProductA* CreateProductA() = 0; virtual AbstractProductB* CreateProductB() = 0;protected: AbstractFactory(); //抽象類別建構函式寫為protected,防止外部構造抽象類別private:};//建立初級怪物工廠class ConcreteFactory1:public AbstractFactory{public: ConcreteFactory1(); ~ConcreteFactory1(); AbstractProductA* CreateProductA(); AbstractProductB* CreateProductB();protected:private:};//建立中級怪物工廠class ConcreteFactory2:public AbstractFactory{public: ConcreteFactory2(); ~ConcreteFactory2(); AbstractProductA* CreateProductA(); AbstractProductB* CreateProductB();protected:private:};#endif
#include Factory.h#include Product.h#include using namespace std;AbstractFactory::AbstractFactory(){}AbstractFactory::~AbstractFactory(){}ConcreteFactory1::ConcreteFactory1(){}ConcreteFactory1::~ConcreteFactory1(){}AbstractProductA* ConcreteFactory1::CreateProductA(){ return new ProductA1();}AbstractProductB* ConcreteFactory1::CreateProductB(){ return new ProductB1();}ConcreteFactory2::ConcreteFactory2(){}ConcreteFactory2::~ConcreteFactory2(){}AbstractProductA* ConcreteFactory2::CreateProductA(){ return new ProductA2();}AbstractProductB* ConcreteFactory2::CreateProductB(){ return new ProductB2();}
main測試
#include Factory.h#include using namespace std;int main(int argc,char* argv[]){ //初級怪物 AbstractFactory* cf1 = new ConcreteFactory1(); cf1->CreateProductA(); cf1->CreateProductB(); //中級怪物 AbstractFactory* cf2 = new ConcreteFactory2(); cf2->CreateProductA(); cf2->CreateProductB(); return 0;}