• <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模式的簡(jiǎn)化詮釋?zhuān)⒔o出其C++實(shí)現(xiàn)。

            0.2 說(shuō)明

            Project

            Design Pattern Explanation(By K_Eckel)

            Authorization

            Free Distributed but Ownership Reserved

            Date

            Test Bed

            MS Visual C++ 6.0

            0.3 參考

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

            u       書(shū)籍

            [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 問(wèn)題

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

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

            2.2 模式選擇

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


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

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

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

                   AbstractFactory模式的實(shí)現(xiàn)比較簡(jiǎn)單,這里為了方便初學(xué)者的學(xué)習(xí)和參考,將給出完整的實(shí)現(xiàn)代碼(所有代碼采用C++實(shí)現(xiàn),并在VC 6.0下測(cè)試運(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)代碼很簡(jiǎn)單,在測(cè)試程序中可以看到,當(dāng)我們要?jiǎng)?chuàng)建一組對(duì)象(ProductA1,ProductA2)的時(shí)候我們只用維護(hù)一個(gè)創(chuàng)建對(duì)象(ConcreteFactory1),大大簡(jiǎn)化了維護(hù)的成本和工作。

            2.4 討論

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


            久久综合亚洲欧美成人| 久久露脸国产精品| 亚洲AV日韩AV天堂久久| 亚洲精品乱码久久久久久自慰| 久久人人爽人人爽人人片AV不 | 亚洲国产精品无码久久一线| 久久综合狠狠综合久久| 精品无码人妻久久久久久| 久久精品国产亚洲AV影院| 久久99国产精品二区不卡| 伊人久久大香线蕉精品不卡| 97久久国产亚洲精品超碰热 | 色综合久久中文字幕无码| 青青青青久久精品国产h| 久久久久久国产精品无码下载| 久久国产精品久久久| 久久亚洲中文字幕精品一区| 色噜噜狠狠先锋影音久久| 99久久做夜夜爱天天做精品| 久久国产精品久久久| 久久久久久毛片免费看| 漂亮人妻被黑人久久精品| 性欧美大战久久久久久久| AAA级久久久精品无码区| 久久综合亚洲欧美成人| 中文字幕日本人妻久久久免费| 久久av高潮av无码av喷吹| 国产精品久久久久无码av| 少妇久久久久久被弄高潮| 狠狠色综合网站久久久久久久高清| 一本久久久久久久| 免费观看成人久久网免费观看| 久久人人妻人人爽人人爽| 久久人人爽人人爽人人片av麻烦| 伊人 久久 精品| 久久久久高潮综合影院| 久久久久久国产精品无码下载| 久久久亚洲AV波多野结衣| 一本一本久久a久久综合精品蜜桃| 久久人人青草97香蕉| 国产精品乱码久久久久久软件 |