• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            0 引言

            0.1 目的

                   本文檔給出設(shè)計(jì)模式之——AbstractFactory模式的簡化詮釋,并給出其C++實(shí)現(xiàn)。

            0.2 說明

            Project

            Design Pattern Explanation(By K_Eckel)

            Authorization

            Free Distributed but Ownership Reserved

            Date

            Test Bed

            MS Visual C++ 6.0

            0.3 參考

                   在本文檔的寫作中,參考了以下的資源,在此列出表示感謝:

            u       書籍

            [GoF 2000]:GoF,Design Patterns-Elements of Reusable Object-Oriented Software

            Addison-Wesley 2000/9.

                    [Martine 2003]:Robert C.Martine, Agile Software Development Principles, Patterns, and Practices, Pearson Education, 2003.

            0.4 聯(lián)系作者

            Author

            K_Eckel

            State

            Candidate for Master’s Degree School of

            E_mail

            frwei@whu.edu.cn  

            2 AbstractFactory模式

            2.1 問題

                   假設(shè)我們要開發(fā)一款游戲,當(dāng)然為了吸引更多的人玩,游戲難度不能太大(讓大家都沒有信心了,估計(jì)游戲也就沒有前途了),但是也不能太簡單(沒有挑戰(zhàn)性也不符合玩家的心理)。于是我們就可以采用這樣一種處理策略:為游戲設(shè)立等級(jí),初級(jí)、中級(jí)、高級(jí)甚至有BT級(jí)。假設(shè)也是過關(guān)的游戲,每個(gè)關(guān)卡都有一些怪物(monster)守著,玩家要把這些怪 物干掉才可以過關(guān)。作為開發(fā)者,我們就不得不創(chuàng)建怪物的類,然后初級(jí)怪物、中級(jí)怪物等都繼承自怪物類(當(dāng)然不同種類的則需要另創(chuàng)建類,但是模式相同)。在 每個(gè)關(guān)卡,我們都要?jiǎng)?chuàng)建怪物的實(shí)例,例如初級(jí)就創(chuàng)建初級(jí)怪物(有很多種類)、中級(jí)創(chuàng)建中級(jí)怪物等。可以想象在這個(gè)系統(tǒng)中,將會(huì)有成千上萬的怪物實(shí)例要?jiǎng)?chuàng) 建,問題是還要保證創(chuàng)建的時(shí)候不會(huì)出錯(cuò):初級(jí)不能創(chuàng)建BT級(jí)的怪物(玩家就郁悶了,玩家一郁悶,游戲也就掛掛了),反之也不可以。

                   AbstractFactory模式就是用來解決這類問題的:要?jiǎng)?chuàng)建一組相關(guān)或者相互依賴的對(duì)象。

            2.2 模式選擇

                   AbstractFactory模式典型的結(jié)構(gòu)圖為:


            2-1AbstractFactoryPattern結(jié)構(gòu)圖

                   AbstractFactory模式關(guān)鍵就是將這一組對(duì)象的創(chuàng)建封裝到一個(gè)用于創(chuàng)建對(duì)象的類(ConcreteFactory)中,維護(hù)這樣一個(gè)創(chuàng)建類總比維護(hù)n多相關(guān)對(duì)象的創(chuàng)建過程要簡單的多。

            2.3 實(shí)現(xiàn)

                   AbstractFactory模式的實(shí)現(xiàn)比較簡單,這里為了方便初學(xué)者的學(xué)習(xí)和參考,將給出完整的實(shí)現(xiàn)代碼(所有代碼采用C++實(shí)現(xiàn),并在VC 6.0下測試運(yùn)行)。

            代碼片斷1Product.h
            //Product.h

            #ifndef _PRODUCT_H_
            #define _PRODUCT_H_

            class AbstractProductA
            {
            public:
             virtual ~AbstractProductA();

            protected:
             AbstractProductA();

            private:

            };

            class AbstractProductB
            {
            public:
             virtual ~AbstractProductB();

            protected:
             AbstractProductB();

            private:

            };

            class ProductA1:public AbstractProductA
            {
            public:
             ProductA1();

             ~ProductA1();

            protected:

            private:

            };

            class ProductA2:public AbstractProductA
            {
            public:
             ProductA2();

             ~ProductA2();

            protected:

            private:

            };

            class ProductB1:public AbstractProductB
            {
            public:
             ProductB1();

             ~ProductB1();

            protected:

            private:

            };

            class ProductB2:public AbstractProductB
            {
            public:
             ProductB2();

             ~ProductB2();

            protected:

            private:

            };

            #endif //~_PRODUCT_H_

            代碼片斷2Product.cpp
            //Product.cpp

            #include "Product.h"

            #include <iostream>
            using namespace std;

            AbstractProductA::AbstractProductA()
            {

            }

            AbstractProductA::~AbstractProductA()
            {

            }

            AbstractProductB::AbstractProductB()
            {

            }

            AbstractProductB::~AbstractProductB()
            {

            }

            ProductA1::ProductA1()
            {
             cout<<"ProductA1..."<<endl;
            }

            ProductA1::~ProductA1()
            {

            }

            ProductA2::ProductA2()
            {
             cout<<"ProductA2..."<<endl;
            }

            ProductA2::~ProductA2()
            {

            }

            ProductB1::ProductB1()
            {
             cout<<"ProductB1..."<<endl;
            }

            ProductB1::~ProductB1()
            {

            }

            ProductB2::ProductB2()
            {
             cout<<"ProductB2..."<<endl;
            }

            ProductB2::~ProductB2()
            {

            }

            代碼片斷3AbstractFactory.h
            //AbstractFactory.h

            #ifndef _ABSTRACTFACTORY_H_
            #define _ABSTRACTFACTORY_H_

            class AbstractProductA;
            class AbstractProductB;

            class AbstractFactory
            {
            public:
             virtual ~AbstractFactory();

             virtual AbstractProductA* CreateProductA() = 0;

             virtual AbstractProductB* CreateProductB() = 0;

            protected:
             AbstractFactory();

            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 //~_ABSTRACTFACTORY_H_

            代碼片斷4AbstractFactory.cpp
            //AbstractFactory.cpp

            #include "AbstractFactory.h"
            #include "Product.h"

            #include <iostream>
            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();
            }

            代碼片斷5main.cpp
            //main.cpp

            #include "AbstractFactory.h"

            #include <iostream>
            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;
            }

                   AbstractFactory模式的實(shí)現(xiàn)代碼很簡單,在測試程序中可以看到,當(dāng)我們要?jiǎng)?chuàng)建一組對(duì)象(ProductA1,ProductA2)的時(shí)候我們只用維護(hù)一個(gè)創(chuàng)建對(duì)象(ConcreteFactory1),大大簡化了維護(hù)的成本和工作。

            2.4 討論

                   AbstractFactory模式和Factory模式的區(qū)別是初學(xué)(使用)設(shè)計(jì)模式時(shí)候的一個(gè)容易引起困惑的地方。實(shí)際上,AbstractFactory模式是為創(chuàng)建一組(有多類)相關(guān)或依賴的對(duì)象提供創(chuàng)建接口,而Factory模式正如我在相應(yīng)的文檔中分析的是為一類對(duì)象提供創(chuàng)建接口或延遲對(duì)象的創(chuàng)建到子類中實(shí)現(xiàn)。并且可以看到,AbstractFactory模式通常都是使用Factory模式實(shí)現(xiàn)(ConcreteFactory1)。


            亚洲精品无码久久毛片| 久久亚洲国产成人精品性色| 久久99精品国产99久久| 69SEX久久精品国产麻豆| 一本大道久久a久久精品综合| 久久强奷乱码老熟女| 亚洲精品成人网久久久久久| 久久AV高潮AV无码AV| 久久精品夜夜夜夜夜久久| 久久久免费观成人影院 | 精品国产91久久久久久久| 久久久久99精品成人片| 日韩精品久久无码人妻中文字幕 | 精品亚洲综合久久中文字幕| 亚洲欧美久久久久9999| 精品少妇人妻av无码久久| 亚洲国产婷婷香蕉久久久久久| 精品久久久久久成人AV| 久久笫一福利免费导航 | 精品久久久久久国产| 伊人久久久AV老熟妇色| 久久99精品久久久久久水蜜桃| 狠狠综合久久AV一区二区三区| 国产日韩久久免费影院| 精品久久久久久久久中文字幕| 久久久久久免费视频| 91久久精品国产成人久久| 97精品久久天干天天天按摩 | 久久久久亚洲国产| 久久成人精品| www亚洲欲色成人久久精品| 久久国产精品成人影院| 久久久久亚洲AV无码专区首JN| 香港aa三级久久三级老师2021国产三级精品三级在 | 99久久中文字幕| 精品久久久久久国产| 久久人人添人人爽添人人片牛牛| 青青青国产成人久久111网站| 久久精品国产69国产精品亚洲| 久久国产亚洲精品无码| 97精品久久天干天天天按摩|