設計模式 -- 抽象原廠模式(AbstactFactory)

來源:互聯網
上載者:User

設計模式 -- 抽象原廠模式(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;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.