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

            那誰(shuí)的技術(shù)博客

            感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
            隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
            數(shù)據(jù)加載中……

            常見(jiàn)設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之二-Abstract Factory模式

            作用:
            提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)。

            UML結(jié)構(gòu)圖:


            抽象基類(lèi):
            1)ProductA,ProductB:分別代表不同類(lèi)型的產(chǎn)品,而它們的派生類(lèi)則是這種產(chǎn)品的一個(gè)實(shí)現(xiàn).
            2)AbstractFactory:生產(chǎn)這一系列產(chǎn)品的一個(gè)抽象工廠,它的派生類(lèi)是不同的實(shí)現(xiàn).

            接口函數(shù):
            1)AbstractFactory::CreateProductA和AbstractFactory::CreateProductB:分別是生產(chǎn)不同產(chǎn)品的不同的實(shí)現(xiàn),由各個(gè)派生出來(lái)的抽象工廠實(shí)現(xiàn)之.

            解析:
            Abstract Factory模式和Factory最大的差別就是抽象工廠創(chuàng)建的是一系列相關(guān)的對(duì)象,其中創(chuàng)建的實(shí)現(xiàn)其實(shí)采用的就是Factory模式的方法,對(duì)于某個(gè)實(shí)現(xiàn)的有一個(gè)派生出來(lái)的抽象工廠,另一個(gè)實(shí)現(xiàn)有另一個(gè)派生出來(lái)的工廠,等等.

            可以舉一個(gè)簡(jiǎn)單的例子來(lái)解釋這個(gè)模式:比如,同樣是雞腿(ProductA)和漢堡(ProductB),它們都可以有商店出售(AbstractFactory),但是有不同的實(shí)現(xiàn),有肯德基(ConcreateFactory1)和麥當(dāng)勞(ConcreateFactory2)兩家生產(chǎn)出來(lái)的不同風(fēng)味的雞腿和漢堡(也就是ProductA和ProductB的不同實(shí)現(xiàn)).
            而負(fù)責(zé)生產(chǎn)漢堡和雞腿的就是之前提過(guò)的Factory模式了.

            抽象工廠需要特別注意的地方就是區(qū)分不同類(lèi)型的產(chǎn)品和這些產(chǎn)品的不同實(shí)現(xiàn).顯而易見(jiàn)的,如果有n種產(chǎn)品同時(shí)有m中不同的實(shí)現(xiàn),那么根據(jù)乘法原理可知有n*m個(gè)Factory模式的使用.


            實(shí)現(xiàn):
            1)AbstractFactory.h
            /********************************************************************
            ????created:????2006/07/19
            ????filename:?????AbstractFactory.h
            ????author:????????李創(chuàng)
            ????????????????
            http://m.shnenglu.com/converse/

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


            #ifndef?ABSTRACTFACTORY_H
            #define?ABSTRACTFACTORY_H

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

            //?派生類(lèi)ConcreateProductA1,繼承自AbstractProductA,代表產(chǎn)品A的第一種實(shí)現(xiàn)
            class?ConcreateProductA1
            ????:?
            public?AbstractProductA
            {
            public:
            ????ConcreateProductA1();
            ????
            virtual?~ConcreateProductA1();
            }
            ;

            //?派生類(lèi)ConcreateProductA2,繼承自AbstractProductA,代表產(chǎn)品A的第二種實(shí)現(xiàn)
            class?ConcreateProductA2
            ????:?
            public?AbstractProductA
            {
            public:
            ????ConcreateProductA2();
            ????
            virtual?~ConcreateProductA2();
            }
            ;

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

            //?派生類(lèi)ConcreateProductB1,繼承自AbstractProductB,代表產(chǎn)品B的第一種實(shí)現(xiàn)
            class?ConcreateProductB1
            ????:?
            public?AbstractProductB
            {
            public:
            ????ConcreateProductB1();
            ????
            virtual?~ConcreateProductB1();
            }
            ;

            //?派生類(lèi)ConcreateProductB2,繼承自AbstractProductB,代表產(chǎn)品B的第二種實(shí)現(xiàn)
            class?ConcreateProductB2
            ????:?
            public?AbstractProductB
            {
            public:
            ????ConcreateProductB2();
            ????
            virtual?~ConcreateProductB2();
            }
            ;

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

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

            //?派生類(lèi)ConcreateFactory1,繼承自AbstractFactory
            //?生產(chǎn)產(chǎn)品A和產(chǎn)品B的第一種實(shí)現(xiàn)
            class?ConcreateFactory1
            ????:?
            public?AbstractFactory
            {
            public:
            ????ConcreateFactory1();
            ????
            virtual?~ConcreateFactory1();

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

            //?派生類(lèi)ConcreateFactory2,繼承自AbstractFactory
            //?生產(chǎn)產(chǎn)品A和產(chǎn)品B的第二種實(shí)現(xiàn)
            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:????????李創(chuàng)
            ????????????????
            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(測(cè)試代碼)
            /********************************************************************
            ????created:????2006/07/19
            ????filename:?????Main.cpp
            ????author:????????李創(chuàng)
            ????????????????
            http://m.shnenglu.com/converse/

            ????purpose:????AbstractFactory的測(cè)試代碼
            ********************************************************************
            */


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

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

            ????
            //?生產(chǎn)產(chǎn)品B的第二種實(shí)現(xiàn)
            ????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 那誰(shuí) 閱讀(2471) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): 設(shè)計(jì)模式

            評(píng)論

            # re: 常見(jiàn)設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之二-Abstract Factory模式   回復(fù)  更多評(píng)論   

            寫(xiě)了不少代碼,還是認(rèn)真的嘛
            2007-03-18 21:58 | 黃大仙

            # re: 常見(jiàn)設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之二-Abstract Factory模式   回復(fù)  更多評(píng)論   

            int main()
            {
            // 生產(chǎn)產(chǎn)品A的第一種實(shí)現(xiàn)
            ConcreateFactory1 *pFactory1 = new ConcreateFactory1;
            ~~~~~~~~~~~~為啥是具體類(lèi)不是抽象類(lèi)指針?沒(méi)道理啊
            AbstractProductA *pProductA = pFactory1->CreateProductA();

            // 生產(chǎn)產(chǎn)品B的第二種實(shí)現(xiàn)
            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综合波多野结衣| 无码人妻精品一区二区三区久久久| 日日躁夜夜躁狠狠久久AV| 国产AⅤ精品一区二区三区久久| 大香伊人久久精品一区二区| 国产产无码乱码精品久久鸭| 午夜精品久久久久成人| 久久香蕉国产线看观看99| 亚洲国产精品无码久久久久久曰| 国产精品视频久久久| 国产精品99久久久久久宅男小说| 亚洲国产成人久久综合碰碰动漫3d| 国产aⅴ激情无码久久| 久久久99精品成人片中文字幕| A狠狠久久蜜臀婷色中文网| 精品国产乱码久久久久软件| 精品久久久久久久久久久久久久久| 久久国产精品无码HDAV| 欧美国产成人久久精品| 久久精品国产精品亚洲人人| 久久电影网2021| 久久精品国产亚洲av麻豆色欲| 亚洲欧美日韩久久精品第一区| 欧美久久一区二区三区| 99久久精品免费看国产| 日韩精品久久久久久| 国产午夜福利精品久久2021| 成人久久免费网站| A级毛片无码久久精品免费| 狠狠综合久久综合88亚洲 | 久久精品成人免费国产片小草 | 色综合久久天天综合| 国产精品无码久久久久久| 日韩人妻无码一区二区三区久久 | 亚洲综合熟女久久久30p| 久久久久久精品免费看SSS | 99久久精品国产麻豆| 国产精品久久久久久吹潮| 国产日产久久高清欧美一区|