青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

The Programming world of Alex

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

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

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

OO為我們提供了哪些精華的思想?“封裝”,是的,將車門的創(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ì)變化的,不管你是老爺車門,現(xiàn)代車門,還是鉆石車門,這些和客戶程序代碼都是沒(méi)關(guān)系的,究竟CreateDoor出來(lái)如何結(jié)果都交給多態(tài)來(lái)判斷,我們不用操心。
但是庫(kù)程序代碼還是需要更改的,但我們已經(jīng)將“變化”與客戶程序隔離了。


需求又有變化了,不光要?jiǎng)?chuàng)建車門,還需要?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 閱讀(1683) 評(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)論   

<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(5)

隨筆分類

隨筆檔案

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲黄色片网站| 国产一区二区无遮挡| 久久福利影视| 国产专区欧美精品| 欧美福利影院| 亚洲欧美日韩国产精品| 亚洲第一页中文字幕| 一本色道久久88亚洲综合88| 国产精品一区二区在线观看不卡| 韩日欧美一区| 亚洲一区二区欧美日韩| 久久久久网站| 99亚洲视频| 尤妮丝一区二区裸体视频| 国产精品v片在线观看不卡| 亚洲桃色在线一区| 1769国内精品视频在线播放| 国产日产欧产精品推荐色| 欧美日精品一区视频| 亚洲精品视频一区| 免费一区视频| 久久精品国产欧美亚洲人人爽| 日韩系列欧美系列| 在线视频国内自拍亚洲视频| 国产亚洲精品久| 国产精品美女久久久久av超清| 欧美精品尤物在线| 免费一区二区三区| 久久久国际精品| 亚洲欧美日韩精品在线| 一区二区精品国产| 久久精品国产亚洲a| 久久国产免费| 亚洲一二三级电影| 亚洲最黄网站| 亚洲精品少妇30p| 亚洲国产第一| 亚洲精品久久久一区二区三区| 一区二区在线看| 国产亚洲a∨片在线观看| 国产精品免费观看视频| 欧美日韩国产123区| 欧美日韩国产高清视频| 欧美jizz19性欧美| 免费亚洲一区| 欧美日韩一区二区三区免费看| 欧美高清在线观看| 欧美午夜精品一区| 国产深夜精品| 欧美日韩ab片| 国产精品入口福利| 国产欧美日韩精品专区| 国产亚洲精品自拍| 日韩视频不卡中文| 国产精品99久久久久久久久久久久| 日韩午夜精品| 99re6热只有精品免费观看| 亚洲第一中文字幕在线观看| 在线成人av| 国产偷久久久精品专区| 羞羞视频在线观看欧美| 亚洲午夜久久久久久尤物| 一本一道久久综合狠狠老精东影业 | 亚洲精选视频免费看| 亚洲乱码国产乱码精品精| 91久久精品国产91性色| 亚洲成人直播| 亚洲自拍偷拍福利| 亚洲精品黄网在线观看| 欧美激情免费在线| 日韩亚洲国产精品| 99精品免费网| 国产精品视频一二三| 久久本道综合色狠狠五月| 久久gogo国模裸体人体| 亚洲成人在线观看视频| 亚洲福利视频专区| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美va亚洲va香蕉在线| 久久av红桃一区二区小说| 国产精品美女一区二区| 久久全球大尺度高清视频| 久久精品国产99精品国产亚洲性色| 一区精品在线| 亚洲激情另类| 欧美午夜片在线观看| 久久久久国产一区二区| 久久亚洲美女| 中国成人亚色综合网站| 亚洲女人天堂av| 精品动漫3d一区二区三区| 亚洲国产精品999| 国产精品视频在线观看| 久久综合中文| 欧美精品成人在线| 欧美影院在线| 蘑菇福利视频一区播放| 午夜精品www| 久久蜜桃资源一区二区老牛| 国产欧美在线| 美女日韩在线中文字幕| 欧美日韩成人综合| 久久久久久久久久看片| 欧美日韩成人一区二区三区| 久久久久久国产精品一区| 欧美国产日韩精品| 羞羞视频在线观看欧美| 欧美福利视频在线| 久久精品道一区二区三区| 欧美国产一区二区在线观看| 久久久久88色偷偷免费| 欧美图区在线视频| 亚洲国产欧美不卡在线观看| 国产在线不卡精品| 亚洲一区二区高清| 中文精品99久久国产香蕉| 美女久久网站| 久久婷婷色综合| 国产免费成人av| 一区二区不卡在线视频 午夜欧美不卡在| 经典三级久久| 欧美在线免费一级片| 亚洲欧美一区在线| 欧美日本精品在线| 欧美一区永久视频免费观看| 欧美亚洲第一区| 日韩亚洲国产欧美| 亚洲精品国产视频| 久久久久久一区| 久久久999国产| 国产一区二区黄色| 欧美在线看片| 久久影院午夜论| 国语自产精品视频在线看| 香蕉成人久久| 久久久久国内| 在线观看精品| 久热成人在线视频| 久久嫩草精品久久久精品一| 国产一区清纯| 久久久www成人免费无遮挡大片| 欧美在线观看一二区| 国产小视频国产精品| 午夜综合激情| 久久久福利视频| 精品盗摄一区二区三区| 久久综合精品国产一区二区三区| 久久激情视频| 在线免费不卡视频| 蘑菇福利视频一区播放| 免费欧美在线视频| 亚洲国产裸拍裸体视频在线观看乱了中文| 久久青青草综合| 欧美国产在线视频| 亚洲视频电影在线| 欧美色图天堂网| 国产精品99久久久久久久久久久久| 亚洲欧美精品伊人久久| 国产综合在线视频| 欧美成人在线影院| 亚洲午夜精品在线| 另类专区欧美制服同性| 亚洲麻豆视频| 国产久一道中文一区| 久久免费精品日本久久中文字幕| 亚洲福利久久| 亚洲精品小视频在线观看| 亚洲第一主播视频| 欧美黄色aa电影| 亚洲中字在线| 亚洲高清在线观看| 亚洲免费网站| 精品成人一区| 国产精品va| 玖玖综合伊人| 亚洲视频电影在线| 欧美激情视频网站| 午夜久久一区| 9久草视频在线视频精品| 国产日韩欧美综合| 欧美伦理视频网站| 久久精品卡一| 99视频超级精品| 欧美国产精品va在线观看| 亚洲在线成人精品| 91久久久精品| 国产亚洲欧美日韩日本| 欧美日本高清| 久久精品视频网| 亚洲欧美日韩国产中文| 亚洲国产成人久久综合一区| 欧美中文字幕在线播放| 亚洲素人在线| 亚洲精品综合精品自拍| 国产欧美精品| 国产精品一香蕉国产线看观看 | 亚洲韩国精品一区| 国产精品女同互慰在线看| 欧美精品乱人伦久久久久久| 久久精品人人做人人综合|