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

            The Programming world of Alex

            設(shè)計(jì)模式之AbstractFactory模式

            設(shè)計(jì)模式的目的就是盡量減少“變化”對(duì)程序的影響,尤其是對(duì)客戶程序的影響。AbstractFactory模式作為創(chuàng)建型模式的一種,解決的就是“new”在變化中可能引起的問(wèn)題。

            先來(lái)看看new有何種不好,舉個(gè)創(chuàng)建汽車的車門(mén)的例子:
            很自然的一種想法是:Door *door = new Door();
            但是如果遇到創(chuàng)建老爺車的車門(mén),創(chuàng)建現(xiàn)代車的車門(mén),這段代碼就無(wú)所適從了。

            OO為我們提供了哪些精華的思想?“封裝”,是的,將車門(mén)的創(chuàng)建封裝起來(lái),于是我們有了靜態(tài)工廠方法:
            客戶程序代碼:
            1Door* door = doorFactory->CreateDoor();
            庫(kù)程序代碼:
            1class DoorFactory
            2{
            3public:
            4  Door* CreateDoor()
            5  {
            6    return new Door();
            7  }

            8}

            客戶程序在此是不會(huì)變化的,不管你是老爺車門(mén),現(xiàn)代車門(mén),還是鉆石車門(mén),這些和客戶程序代碼都是沒(méi)關(guān)系的,究竟CreateDoor出來(lái)如何結(jié)果都交給多態(tài)來(lái)判斷,我們不用操心。
            但是庫(kù)程序代碼還是需要更改的,但我們已經(jīng)將“變化”與客戶程序隔離了。


            需求又有變化了,不光要?jiǎng)?chuàng)建車門(mén),還需要?jiǎng)?chuàng)建引擎,車燈,而且還是不同風(fēng)格的。
            這時(shí)候靜態(tài)工廠已經(jīng)應(yīng)付不來(lái)了,靜態(tài)工廠有其自身的缺陷“不能應(yīng)對(duì)不同系列對(duì)象”的變化。

            動(dòng)機(jī):
            軟件系統(tǒng)中,經(jīng)常面臨“一系列相互依賴的對(duì)象”的創(chuàng)建工作。(兩個(gè)特征:“一系列”,“相互依賴”)
            將創(chuàng)建過(guò)程封裝起來(lái),避免“客戶程序”和“多系列具體對(duì)象的創(chuàng)建工作”的緊耦合。

            意圖:
            提供一個(gè)接口,讓該接口負(fù)責(zé)創(chuàng)建一系列“相關(guān)或者相互依賴的對(duì)象”,無(wú)需指定他們具體的類。(GoF23)

            思路:


            對(duì)于客戶程序來(lái)說(shuō),只依賴于三個(gè)抽象的類:AbstractFactory,AbstractProductA,AbstractProductB。
            以下是客戶程序代碼:
             1class CarManager
             2{
             3protected:
             4    AbstractFactory *abstractFactory;
             5public:
             6    //創(chuàng)造Car
             7    void createCar(AbstractFactory *abstractFactory)
             8    {
             9        abstractFactory->CreateEngine();
            10        abstractFactory->CreateDoor();
            11        abstractFactory->CreateLight();
            12    }

            13    //其他的操作
            14    void run(){}
            15}
            ;
            16
            17int _tmain(int argc, _TCHAR* argv[])
            18{
            19    CarManager *carManager = new CarManager();
            20    //創(chuàng)建Classic風(fēng)格的汽車
            21    carManager->createCar(new ClassicFactory());
            22
            23    return 0;
            24}
            所有關(guān)于創(chuàng)建的操作都是用抽象類完成的,對(duì)于具體是何種類型的對(duì)象由多態(tài)實(shí)現(xiàn),以此來(lái)使“客戶代碼”和“多系列具體對(duì)象的創(chuàng)建工作”達(dá)到松耦合。

            如果遇到還需要擴(kuò)展其他風(fēng)格的汽車,可以按下圖的思路

            紅色的部分對(duì)應(yīng)新風(fēng)格的車輛,只需在庫(kù)程序中添加ConcreteFactory3,ProductA3,ProductB3三個(gè)類,而對(duì)于客戶代碼CarManager來(lái)說(shuō)完全不受影響。

            總結(jié):
            AbstractFactory模式有以下三個(gè)要點(diǎn):
            1.應(yīng)對(duì)的問(wèn)題是“多風(fēng)格的系列對(duì)象創(chuàng)建”的變化問(wèn)題,“系列對(duì)象”指的是這些對(duì)象之間有相互依賴或者相互作用的關(guān)系。否則使用“靜態(tài)工廠”足以。
            2.抽象工廠和靜態(tài)工廠的核心是“封裝”,將對(duì)象的創(chuàng)建進(jìn)行封裝,避免“new”引起的問(wèn)題
            3.抽象工程的另一個(gè)核心是“多態(tài)”,通過(guò)動(dòng)態(tài)綁定來(lái)處理“不同風(fēng)格”的問(wèn)題

            注:
            AbstractFactory模式主要針對(duì)“風(fēng)格”的變化,如果“對(duì)象”本身經(jīng)常變化,那么該模式并不適用。


            自己做的示例代碼,僅供參考
              1//////////////////////////////////////////////////////////////////////////
              2// AbstractFactoryTest for AbstractFactory Pattern Test
              3//
              4//////////////////////////////////////////////////////////////////////////
              5
              6#include "stdafx.h"
              7#include "iostream"
              8using namespace std;
              9
             10//Engine,Door,Light are the Abstract Product
             11//這三個(gè)類對(duì)應(yīng)UML圖中的AbstractProduct類
             12class Engine
             13{
             14public:
             15    Engine()
             16    {
             17        cout<<"Abstract Engine Create"<<endl;
             18    }

             19    virtual void doSomething() = 0;
             20}
            ;
             21
             22class Door
             23{
             24public:
             25    Door()
             26    {
             27        cout<<"Abstract Door Create"<<endl;
             28    }

             29    virtual void doSomething() = 0;
             30}
            ;
             31
             32class Light
             33{
             34public:
             35    Light()
             36    {
             37        cout<<"Abstract Light Create"<<endl;
             38    }

             39    virtual void doSomething() = 0;
             40}
            ;
             41
             42//Abstract Factory
             43class AbstractFactory
             44{
             45public:
             46    AbstractFactory()
             47    {
             48        cout<<"AbstractFactory Create"<<endl;
             49    }

             50    virtual Engine* CreateEngine() = 0;
             51    virtual Door* CreateDoor() = 0;
             52    virtual Light* CreateLight() = 0;
             53}
            ;
             54
             55//SpeedEngine,SpeedDoor,SpeedLight are the Products of Speed Style 
             56//這三個(gè)類對(duì)應(yīng)UML圖中的ProductA1,ProductB1,ProductC1類
             57class SpeedEngine:public Engine
             58{
             59public :
             60    SpeedEngine()
             61    {
             62        cout<<"Speed Engine Create"<<endl;
             63    }

             64    void doSomething(){    }
             65}
            ;
             66
             67class SpeedDoor:public Door
             68{
             69public :
             70    SpeedDoor()
             71    {
             72        cout<<"Speed Door Create"<<endl;
             73    }

             74    void doSomething(){    }
             75}
            ;
             76
             77class SpeedLight:public Light
             78{
             79public :
             80    SpeedLight()
             81    {
             82        cout<<"Speed Light Create"<<endl;
             83    }

             84    void doSomething(){    }
             85}
            ;
             86
             87//classicEngine,classicDoor,classicLight are the products of Classic style
             88//這三個(gè)類對(duì)應(yīng)UML圖中的ProductA2,ProductB2,ProductC2類
             89class ClassicEngine:public Engine
             90{
             91public :
             92    ClassicEngine()
             93    {
             94        cout<<"Classic Engine Create"<<endl;
             95    }

             96    void doSomething(){    }
             97}
            ;
             98
             99class ClassicDoor:public Door
            100{
            101public :
            102    ClassicDoor()
            103    {
            104        cout<<"Classic Door Create"<<endl;
            105    }

            106    void doSomething(){    }
            107}
            ;
            108
            109class ClassicLight:public Light
            110{
            111public :
            112    ClassicLight()
            113    {
            114        cout<<"Classic Light Create"<<endl;
            115    }

            116    void doSomething(){    }
            117}
            ;
            118
            119//Factory for Speed Cars
            120//對(duì)應(yīng)UML圖中的ConcreteFactory1類
            121class SpeedFactory:public AbstractFactory
            122{
            123public:
            124    SpeedFactory()
            125    {
            126        cout<<"SpeedFactory Create"<<endl;
            127    }

            128    virtual Engine* CreateEngine()
            129    {
            130        return new SpeedEngine();
            131    }

            132    virtual Door* CreateDoor() 
            133    {
            134        return new SpeedDoor();
            135    }

            136    virtual Light* CreateLight()
            137    {
            138        return new SpeedLight();
            139    }

            140}
            ;
            141
            142//Factory for classic Cars
            143//對(duì)應(yīng)UML圖中的ConcreteFactory2類
            144class ClassicFactory:public AbstractFactory
            145{
            146public:
            147    ClassicFactory()
            148    {
            149        cout<<"ClassicFactory Create"<<endl;
            150    }

            151    virtual Engine* CreateEngine()
            152    {
            153        return new ClassicEngine();
            154    }

            155    virtual Door* CreateDoor() 
            156    {
            157        return new ClassicDoor();
            158    }

            159    virtual Light* CreateLight()
            160    {
            161        return new ClassicLight();
            162    }

            163}
            ;
            164
            165//Client Code ---- use the Abstract Factory & Abstract Product to create the car
            166//this is never changed
            167class CarManager
            168{
            169protected:
            170    AbstractFactory *abstractFactory;
            171public:
            172    //創(chuàng)造Car
            173    void createCar(AbstractFactory *abstractFactory)
            174    {
            175        abstractFactory->CreateEngine();
            176        abstractFactory->CreateDoor();
            177        abstractFactory->CreateLight();
            178    }

            179    //其他的操作
            180    void run(){}
            181}
            ;
            182
            183int _tmain(int argc, _TCHAR* argv[])
            184{
            185    CarManager *carManager = new CarManager();
            186    //創(chuàng)建Classic風(fēng)格的汽車
            187    carManager->createCar(new ClassicFactory());
            188
            189    return 0;
            190}

            posted on 2009-04-06 21:20 Alex@VCC 閱讀(1675) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式

            評(píng)論

            # re: 設(shè)計(jì)模式之AbstractFactory模式 2009-04-07 09:45 匿名

            void createCar(AbstractFactory *abstractFactory)
            如果是這樣子的
            void createCar(char* abstractFactory)
            就更好了,根據(jù)字符串標(biāo)志去查找對(duì)應(yīng)的類工廠,是庫(kù)的任務(wù)。  回復(fù)  更多評(píng)論   

            # re: 設(shè)計(jì)模式之AbstractFactory模式 2009-04-07 09:52 星綻紫輝

            very good.  回復(fù)  更多評(píng)論   

            <2009年4月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(5)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久精品黄AA片一区二区三区| 色欲综合久久躁天天躁蜜桃| 国产精品成人无码久久久久久 | 日本久久久久久中文字幕| 国产精品9999久久久久| 久久精品视频91| 久久综合狠狠综合久久| 狠狠人妻久久久久久综合| 精品久久久久久中文字幕大豆网| 99久久精品毛片免费播放| 色偷偷88欧美精品久久久| 99国产欧美久久久精品蜜芽| 无码国内精品久久人妻麻豆按摩| 99re久久精品国产首页2020| 久久亚洲精品国产精品婷婷| 99久久亚洲综合精品成人| 少妇内射兰兰久久| 中文字幕无码久久人妻| 久久久无码精品午夜| 久久精品黄AA片一区二区三区| 2021国产精品久久精品| 精品久久久久中文字幕一区| 精品久久久久久国产| 成人午夜精品无码区久久| 一本久久a久久精品综合香蕉| 美女写真久久影院| 精品亚洲综合久久中文字幕| 久久人人爽人人爽人人av东京热| 久久人人爽人人澡人人高潮AV | 无码人妻精品一区二区三区久久| 精品国产青草久久久久福利 | 久久久久人妻一区精品| 中文字幕成人精品久久不卡| 久久99精品国产麻豆| 久久精品午夜一区二区福利| 国产成人久久精品一区二区三区| 久久笫一福利免费导航 | 国产精品一久久香蕉国产线看观看| 亚洲精品无码久久久久| 日韩人妻无码一区二区三区久久| 亚洲精品无码久久一线|