• <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://m.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://m.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://m.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 那誰 閱讀(2470) 評論(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
            69国产成人综合久久精品| 久久影院午夜理论片无码 | 久久99国产乱子伦精品免费| 一本一道久久a久久精品综合| 久久亚洲熟女cc98cm| 色综合久久中文字幕无码 | 成人久久久观看免费毛片| 免费观看成人久久网免费观看| 欧美精品福利视频一区二区三区久久久精品 | 人妻无码久久精品| 午夜欧美精品久久久久久久 | 亚洲精品无码久久毛片| 久久精品九九亚洲精品| 久久天天躁狠狠躁夜夜2020| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 无码人妻精品一区二区三区久久 | 91久久精品电影| 久久亚洲国产精品成人AV秋霞 | 国产精品久久久久久久app | 久久本道伊人久久| 久久亚洲熟女cc98cm| 久久久久女教师免费一区| 久久人人爽人人爽人人AV| 亚洲?V乱码久久精品蜜桃| 91超碰碰碰碰久久久久久综合| 久久久久亚洲AV成人片 | 久久无码人妻一区二区三区| 久久久久亚洲AV片无码下载蜜桃| 国产AV影片久久久久久| 99麻豆久久久国产精品免费| 色狠狠久久AV五月综合| 久久国产劲爆AV内射—百度| 亚洲伊人久久成综合人影院| 久久精品国产秦先生| 粉嫩小泬无遮挡久久久久久| 亚洲国产欧洲综合997久久| 丁香色欲久久久久久综合网| 久久天天躁狠狠躁夜夜2020一 | 国产一区二区精品久久| 97热久久免费频精品99| 国产精品久久久久久一区二区三区|