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

            那誰的技術博客

            感興趣領域:高性能服務器編程,存儲,算法,Linux內核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數據加載中……

            常見設計模式的解析和實現(C++)之二-Abstract Factory模式

            作用:
            提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

            UML結構圖:


            抽象基類:
            1)ProductA,ProductB:分別代表不同類型的產品,而它們的派生類則是這種產品的一個實現.
            2)AbstractFactory:生產這一系列產品的一個抽象工廠,它的派生類是不同的實現.

            接口函數:
            1)AbstractFactory::CreateProductA和AbstractFactory::CreateProductB:分別是生產不同產品的不同的實現,由各個派生出來的抽象工廠實現之.

            解析:
            Abstract Factory模式和Factory最大的差別就是抽象工廠創建的是一系列相關的對象,其中創建的實現其實采用的就是Factory模式的方法,對于某個實現的有一個派生出來的抽象工廠,另一個實現有另一個派生出來的工廠,等等.

            可以舉一個簡單的例子來解釋這個模式:比如,同樣是雞腿(ProductA)和漢堡(ProductB),它們都可以有商店出售(AbstractFactory),但是有不同的實現,有肯德基(ConcreateFactory1)和麥當勞(ConcreateFactory2)兩家生產出來的不同風味的雞腿和漢堡(也就是ProductA和ProductB的不同實現).
            而負責生產漢堡和雞腿的就是之前提過的Factory模式了.

            抽象工廠需要特別注意的地方就是區分不同類型的產品和這些產品的不同實現.顯而易見的,如果有n種產品同時有m中不同的實現,那么根據乘法原理可知有n*m個Factory模式的使用.


            實現:
            1)AbstractFactory.h
            /********************************************************************
            ????created:????2006/07/19
            ????filename:?????AbstractFactory.h
            ????author:????????李創
            ????????????????
            http://www.shnenglu.com/converse/

            ????purpose:????AbstractFactory的演示代碼
            ********************************************************************
            */


            #ifndef?ABSTRACTFACTORY_H
            #define?ABSTRACTFACTORY_H

            //?抽象基類AbstractProductA,代表產品A的抽象
            class?AbstractProductA
            {
            public:
            ????AbstractProductA()?
            {}
            ????
            virtual?~AbstractProductA(){};
            }
            ;

            //?派生類ConcreateProductA1,繼承自AbstractProductA,代表產品A的第一種實現
            class?ConcreateProductA1
            ????:?
            public?AbstractProductA
            {
            public:
            ????ConcreateProductA1();
            ????
            virtual?~ConcreateProductA1();
            }
            ;

            //?派生類ConcreateProductA2,繼承自AbstractProductA,代表產品A的第二種實現
            class?ConcreateProductA2
            ????:?
            public?AbstractProductA
            {
            public:
            ????ConcreateProductA2();
            ????
            virtual?~ConcreateProductA2();
            }
            ;

            //?抽象基類AbstractProductB,代表產品B的抽象
            class?AbstractProductB
            {
            public:
            ????AbstractProductB()?
            {}
            ????
            virtual?~AbstractProductB(){};
            }
            ;

            //?派生類ConcreateProductB1,繼承自AbstractProductB,代表產品B的第一種實現
            class?ConcreateProductB1
            ????:?
            public?AbstractProductB
            {
            public:
            ????ConcreateProductB1();
            ????
            virtual?~ConcreateProductB1();
            }
            ;

            //?派生類ConcreateProductB2,繼承自AbstractProductB,代表產品B的第二種實現
            class?ConcreateProductB2
            ????:?
            public?AbstractProductB
            {
            public:
            ????ConcreateProductB2();
            ????
            virtual?~ConcreateProductB2();
            }
            ;

            //?抽象基類AbstractFactory,工廠的抽象類,生產產品A和產品B
            class?AbstractFactory
            {
            public:
            ????AbstractFactory()
            {}
            ????
            virtual?~AbstractFactory(){}

            ????
            virtual?AbstractProductA*?CreateProductA()?=?0;
            ????
            virtual?AbstractProductB*?CreateProductB()?=?0;
            }
            ;

            //?派生類ConcreateFactory1,繼承自AbstractFactory
            //?生產產品A和產品B的第一種實現
            class?ConcreateFactory1
            ????:?
            public?AbstractFactory
            {
            public:
            ????ConcreateFactory1();
            ????
            virtual?~ConcreateFactory1();

            ????
            virtual?AbstractProductA*?CreateProductA();
            ????
            virtual?AbstractProductB*?CreateProductB();
            }
            ;

            //?派生類ConcreateFactory2,繼承自AbstractFactory
            //?生產產品A和產品B的第二種實現
            class?ConcreateFactory2
            ????:?
            public?AbstractFactory
            {
            public:
            ????ConcreateFactory2();
            ????
            virtual?~ConcreateFactory2();

            ????
            virtual?AbstractProductA*?CreateProductA();
            ????
            virtual?AbstractProductB*?CreateProductB();
            }
            ;

            #endif

            2)AbstractFactory.cpp
            /********************************************************************
            ????created:????2006/07/19
            ????filename:?????AbstractFactory.cpp
            ????author:????????李創
            ????????????????
            http://www.shnenglu.com/converse/

            ????purpose:????AbstractFactory的演示代碼
            ********************************************************************
            */


            #include?
            <iostream>
            #include?
            "AbstractFactory.h"

            ConcreateProductA1::ConcreateProductA1()
            {
            ????std::cout?
            <<?"construction?of?ConcreateProductA1\n";
            }


            ConcreateProductA1::
            ~ConcreateProductA1()
            {
            ????std::cout?
            <<?"destruction?of?ConcreateProductA1\n";
            }


            ConcreateProductA2::ConcreateProductA2()
            {
            ????std::cout?
            <<?"construction?of?ConcreateProductA2\n";
            }


            ConcreateProductA2::
            ~ConcreateProductA2()
            {
            ????std::cout?
            <<?"destruction?of?ConcreateProductA2\n";
            }


            ConcreateProductB1::ConcreateProductB1()
            {
            ????std::cout?
            <<?"construction?of?ConcreateProductB1\n";
            }


            ConcreateProductB1::
            ~ConcreateProductB1()
            {
            ????std::cout?
            <<?"destruction?of?ConcreateProductB1\n";
            }


            ConcreateProductB2::ConcreateProductB2()
            {
            ????std::cout?
            <<?"construction?of?ConcreateProductB2\n";
            }


            ConcreateProductB2::
            ~ConcreateProductB2()
            {
            ????std::cout?
            <<?"destruction?of?ConcreateProductB2\n";
            }


            ConcreateFactory1::ConcreateFactory1()
            {
            ????std::cout?
            <<?"construction?of?ConcreateFactory1\n";
            }


            ConcreateFactory1::
            ~ConcreateFactory1()
            {
            ????std::cout?
            <<?"destruction?of?ConcreateFactory1\n";
            }


            AbstractProductA
            *?ConcreateFactory1::CreateProductA()
            {
            ????
            return?new?ConcreateProductA1();
            }


            AbstractProductB
            *?ConcreateFactory1::CreateProductB()
            {
            ????
            return?new?ConcreateProductB1();
            }


            ConcreateFactory2::ConcreateFactory2()
            {
            ????std::cout?
            <<?"construction?of?ConcreateFactory2\n";
            }


            ConcreateFactory2::
            ~ConcreateFactory2()
            {
            ????std::cout?
            <<?"destruction?of?ConcreateFactory2\n";
            }


            AbstractProductA
            *?ConcreateFactory2::CreateProductA()
            {
            ????
            return?new?ConcreateProductA2();
            }


            AbstractProductB
            *?ConcreateFactory2::CreateProductB()
            {
            ????
            return?new?ConcreateProductB2();
            }

            3)Main.cpp(測試代碼)
            /********************************************************************
            ????created:????2006/07/19
            ????filename:?????Main.cpp
            ????author:????????李創
            ????????????????
            http://www.shnenglu.com/converse/

            ????purpose:????AbstractFactory的測試代碼
            ********************************************************************
            */


            #include?
            "AbstractFactory.h"
            #include?
            <stdlib.h>

            int?main()
            {
            ????
            //?生產產品A的第一種實現
            ????ConcreateFactory1?*pFactory1?=?new?ConcreateFactory1;
            ????AbstractProductA?
            *pProductA?=?pFactory1->CreateProductA();

            ????
            //?生產產品B的第二種實現
            ????ConcreateFactory2?*pFactory2?=?new?ConcreateFactory2;
            ????AbstractProductB?
            *pProductB?=?pFactory2->CreateProductB();

            ????delete?pFactory1;
            ????delete?pProductA;
            ????delete?pFactory2;
            ????delete?pProductB;

            ????system(
            "pause");

            ????
            return?0;
            }


            posted on 2006-07-21 01:15 那誰 閱讀(2474) 評論(2)  編輯 收藏 引用 所屬分類: 設計模式

            評論

            # re: 常見設計模式的解析和實現(C++)之二-Abstract Factory模式   回復  更多評論   

            寫了不少代碼,還是認真的嘛
            2007-03-18 21:58 | 黃大仙

            # re: 常見設計模式的解析和實現(C++)之二-Abstract Factory模式   回復  更多評論   

            int main()
            {
            // 生產產品A的第一種實現
            ConcreateFactory1 *pFactory1 = new ConcreateFactory1;
            ~~~~~~~~~~~~為啥是具體類不是抽象類指針?沒道理啊
            AbstractProductA *pProductA = pFactory1->CreateProductA();

            // 生產產品B的第二種實現
            ConcreateFactory2 *pFactory2 = new ConcreateFactory2;
            AbstractProductB *pProductB = pFactory2->CreateProductB();

            delete pFactory1;
            delete pProductA;
            delete pFactory2;
            delete pProductB;

            system("pause");

            return 0;
            }
            2008-05-06 19:54 | overcomeunicom
            99久久精品国产一区二区蜜芽| 国产精品美女久久久久久2018| 国内精品久久久久影院免费| 精品久久久久久久久中文字幕| 国产人久久人人人人爽| 九九久久99综合一区二区| 亚洲综合精品香蕉久久网97| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 97精品国产91久久久久久| 久久国产乱子伦精品免费午夜| 精品久久久久久中文字幕大豆网| 国产欧美一区二区久久| 久久久久久久97| 久久精品无码av| 久久综合九色综合97_久久久| 狠狠综合久久综合88亚洲| 国产视频久久| 久久精品国产91久久麻豆自制 | 亚洲精品乱码久久久久66| 精品一久久香蕉国产线看播放| 色综合久久无码中文字幕| 伊人情人综合成人久久网小说 | 综合久久一区二区三区| 成人a毛片久久免费播放| 97热久久免费频精品99| 亚洲精品无码久久久久| 伊人久久综合无码成人网| 中文成人无码精品久久久不卡| 久久Av无码精品人妻系列| 久久久无码精品亚洲日韩京东传媒 | 国产Av激情久久无码天堂| 无码专区久久综合久中文字幕| 伊人久久五月天| 久久夜色精品国产亚洲| 亚洲AV成人无码久久精品老人| 思思久久精品在热线热| 久久久久久国产精品美女| 久久www免费人成看片| 国产精品女同久久久久电影院| 久久久久女人精品毛片| 久久不射电影网|