• <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 那誰 閱讀(2473) 評論(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
            亚洲级αV无码毛片久久精品| 久久精品毛片免费观看| 国产精品久久永久免费| 久久99精品国产麻豆不卡| 精品一二三区久久aaa片| 国产精品99久久久久久宅男| 中文字幕久久精品| 久久精品视频网| 久久久久久久久无码精品亚洲日韩 | 久久久青草青青亚洲国产免观| 亚洲精品无码久久毛片| 伊人久久大香线蕉综合影院首页| 久久婷婷五月综合97色直播| 久久香蕉国产线看观看精品yw| 香蕉99久久国产综合精品宅男自 | 久久久久久久久久久免费精品| 久久久久无码精品国产不卡| 久久国产成人精品麻豆| 久久亚洲精品无码VA大香大香| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲国产精品久久久久| 久久久亚洲欧洲日产国码二区 | 婷婷久久久亚洲欧洲日产国码AV| 7国产欧美日韩综合天堂中文久久久久 | 九九久久精品无码专区| 国产精品99精品久久免费| 久久久久亚洲Av无码专| 思思久久好好热精品国产| 久久午夜夜伦鲁鲁片免费无码影视| 久久国产乱子伦精品免费强| 人妻无码αv中文字幕久久琪琪布| 久久久久国产精品麻豆AR影院| A级毛片无码久久精品免费| 99久久99这里只有免费费精品| 久久综合亚洲色HEZYO社区| 国产69精品久久久久观看软件 | 人妻少妇久久中文字幕| 久久亚洲中文字幕精品一区| 国内精品久久久久久不卡影院| 中文精品久久久久国产网址 | 性欧美大战久久久久久久|