• <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久久国产综合精品网成人影院| 热re99久久精品国产99热| 久久天天躁狠狠躁夜夜2020| 亚洲欧美伊人久久综合一区二区| 国产亚洲精品美女久久久| 亚洲午夜无码AV毛片久久| 久久av无码专区亚洲av桃花岛| 国产精品久久久天天影视香蕉| 久久精品亚洲AV久久久无码 | 久久久久这里只有精品| 亚洲va中文字幕无码久久不卡| 99久久免费只有精品国产| 武侠古典久久婷婷狼人伊人| 成人国内精品久久久久一区| 亚洲国产成人久久综合区| 精品久久久久久亚洲| 久久久亚洲裙底偷窥综合| 国产精品成人无码久久久久久 | 91精品久久久久久无码| 少妇高潮惨叫久久久久久| 国产激情久久久久影院| 久久精品无码专区免费东京热| 要久久爱在线免费观看| 国内精品久久久久久久影视麻豆 | 亚洲αv久久久噜噜噜噜噜| 香港aa三级久久三级老师2021国产三级精品三级在 | 四虎国产精品免费久久久| 亚洲av日韩精品久久久久久a| 热久久国产欧美一区二区精品| 久久99热精品| 99久久国产亚洲高清观看2024 | 精品久久久久久无码中文字幕| 久久久久亚洲精品无码蜜桃| 精品久久久一二三区| 亚洲人成网站999久久久综合| 亚洲а∨天堂久久精品9966| 久久久精品日本一区二区三区| 久久免费观看视频|