• <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 那誰 閱讀(2467) 評論(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
            久久Av无码精品人妻系列| 狠狠色丁香婷婷综合久久来来去| 九九99精品久久久久久| 伊人久久综合精品无码AV专区| 久久精品国产精品亚洲人人 | 77777亚洲午夜久久多喷| 欧美精品一区二区久久| 久久精品国产亚洲精品| 久久久久亚洲精品天堂久久久久久 | 午夜福利91久久福利| 久久综合视频网站| 久久综合鬼色88久久精品综合自在自线噜噜| 精品久久香蕉国产线看观看亚洲| 97超级碰碰碰久久久久| 久久无码av三级| 久久丝袜精品中文字幕| 色99久久久久高潮综合影院| 亚洲精品国产综合久久一线| 中文字幕精品久久| 国产亚洲欧美精品久久久| 国内精品久久久久久野外| 国产精品久久久99| 老男人久久青草av高清| 精品无码久久久久久尤物| 99久久精品国产一区二区| 亚洲国产精品一区二区三区久久| 无码8090精品久久一区| 久久婷婷成人综合色综合| 精品久久久久久国产三级| 久久久久久久免费视频| 72种姿势欧美久久久久大黄蕉 | 香蕉久久夜色精品升级完成| 久久精品国产亚洲AV嫖农村妇女| segui久久国产精品| 精品久久久中文字幕人妻| 色综合久久中文综合网| 精品国产乱码久久久久久人妻 | 久久国产乱子伦精品免费强| 一级做a爰片久久毛片免费陪| 国内精品久久人妻互换| 香蕉久久夜色精品国产2020|