• <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>

            Just enjoy programming

            c++設計模式(九) 抽象工廠(Abstract Factory)

                  抽象工廠(Abstract Factory)模式看起來和前面看到的工廠方法很相似,只是它使用若干工廠方法(Factory Method)模式。每個工廠方法模式創建一個不同類型的對象。當創建一個工廠對象時,要決定將如何使用由那個工廠創建的所有對象。示例代碼如下(假設要創建一個通用的游戲環境,并且希望它能支持不同類型的游戲):
            #include<iostream>
            using namespace std;

            class Obstacle
            {
            public:
                virtual void action()=0;
            };

            class Player
            {
            public:
                virtual void interactWith(Obstacle*)=0;
            };

            class Kitty: public Player
            {
                virtual void interactWith(Obstacle *ob)
                {
                    cout<<"Kitty has encountered a";
                    ob->action();
                }
            };

            class KungFuGuy: public Player
            {
                virtual void interactWith(Obstacle* ob)
                {
                    cout<<"KungFuGuy now battles against a";
                    ob->action();
                }
            };
            class Puzzle: public Obstacle
            {
            public:
                void action(){cout<<"Puzzle"<<endl;}
            };

            class NastyWeapon: public Obstacle
            {
            public:
                void action(){cout<<"NastyWeapon"<<endl;}
            };

            //the abstract factory
            class GameElementFactory
            {
            public:
                virtual Player* makePlayer()=0;
                virtual Obstacle* makeObstacle()=0;
            };

            //concreate factories
            class KittiesAndPuzzles:public GameElementFactory
            {
            public:
                virtual Player* makePlayer(){return new Kitty;}
                virtual Obstacle * makeObstacle(){return new Puzzle;}
            };

            class KillAndDismember:public GameElementFactory
            {
            public:
                virtual Player* makePlayer(){return new KungFuGuy;}
                virtual Obstacle *makeObstacle(){return new NastyWeapon;}
            };


            class GameEnvironment
            {
                GameElementFactory* gef;
                Player* p;
                Obstacle *ob;
            public:
                GameEnvironment(GameElementFactory * factory)
                    :gef(factory),p(factory->makePlayer()),ob(factory->makeObstacle()){}
                void play(){p->interactWith(ob);}
                ~GameEnvironment()
                {
                    delete p;
                    delete ob;
                    delete gef;
                }
            };

            int main()
            {
                GameEnvironment
                    g1(new KittiesAndPuzzles),
                    g2(new KillAndDismember);
                g1.play();
                g2.play();
            }

            在此環境中,Player對象與Obstacle 對象交互,但是Player和Obstacle類型依賴于具體的游戲??梢赃x擇特定的GameElementFactory來決定游戲的類型,然后GameEnvironment控制游戲的設置和進行。在本例中,游戲的設置和進行很簡單,但是那些動作在很大程度上決定了游戲的結果。

            posted on 2011-05-03 23:40 周強 閱讀(374) 評論(0)  編輯 收藏 引用 所屬分類: c/c++

            亚洲va久久久噜噜噜久久| 久久精品国产亚洲精品2020| 精品久久久久久国产牛牛app| 7国产欧美日韩综合天堂中文久久久久| 很黄很污的网站久久mimi色| 午夜精品久久久内射近拍高清| 亚洲国产精品无码久久久不卡 | 亚洲色欲久久久久综合网| 一本色道久久综合| 久久久久久久久无码精品亚洲日韩| 久久婷婷综合中文字幕| 久久国产精品免费一区| 人妻丰满AV无码久久不卡| 久久精品免费大片国产大片| 日韩精品无码久久久久久| 久久久久无码国产精品不卡| 久久男人Av资源网站无码软件| 日本久久中文字幕| 99久久亚洲综合精品成人| 色综合久久综合中文综合网| 久久亚洲中文字幕精品一区| 久久精品国产福利国产秒| 一本久久免费视频| 久久久久久久久久免免费精品| 久久99国产精品二区不卡| 亚洲精品白浆高清久久久久久 | 色欲久久久天天天综合网精品 | 精品国产乱码久久久久久1区2区 | 一级做a爰片久久毛片16| 乱亲女H秽乱长久久久| 久久综合久久综合亚洲| 蜜臀久久99精品久久久久久| 26uuu久久五月天| 国产精品免费看久久久香蕉| 99久久综合狠狠综合久久止| 午夜欧美精品久久久久久久| 影音先锋女人AV鲁色资源网久久| 中文字幕精品久久久久人妻| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 亚洲国产成人久久综合碰碰动漫3d| 国内精品久久久久影院一蜜桃|