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

The Programming world of Alex

設計模式之AbstractFactory模式

設計模式的目的就是盡量減少“變化”對程序的影響,尤其是對客戶程序的影響。AbstractFactory模式作為創建型模式的一種,解決的就是“new”在變化中可能引起的問題。

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

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

8}

客戶程序在此是不會變化的,不管你是老爺車門,現代車門,還是鉆石車門,這些和客戶程序代碼都是沒關系的,究竟CreateDoor出來如何結果都交給多態來判斷,我們不用操心。
但是庫程序代碼還是需要更改的,但我們已經將“變化”與客戶程序隔離了。


需求又有變化了,不光要創建車門,還需要創建引擎,車燈,而且還是不同風格的。
這時候靜態工廠已經應付不來了,靜態工廠有其自身的缺陷“不能應對不同系列對象”的變化。

動機:
軟件系統中,經常面臨“一系列相互依賴的對象”的創建工作。(兩個特征:“一系列”,“相互依賴”)
將創建過程封裝起來,避免“客戶程序”和“多系列具體對象的創建工作”的緊耦合。

意圖:
提供一個接口,讓該接口負責創建一系列“相關或者相互依賴的對象”,無需指定他們具體的類。(GoF23)

思路:


對于客戶程序來說,只依賴于三個抽象的類:AbstractFactory,AbstractProductA,AbstractProductB。
以下是客戶程序代碼:
 1class CarManager
 2{
 3protected:
 4    AbstractFactory *abstractFactory;
 5public:
 6    //創造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    //創建Classic風格的汽車
21    carManager->createCar(new ClassicFactory());
22
23    return 0;
24}
所有關于創建的操作都是用抽象類完成的,對于具體是何種類型的對象由多態實現,以此來使“客戶代碼”和“多系列具體對象的創建工作”達到松耦合。

如果遇到還需要擴展其他風格的汽車,可以按下圖的思路

紅色的部分對應新風格的車輛,只需在庫程序中添加ConcreteFactory3,ProductA3,ProductB3三個類,而對于客戶代碼CarManager來說完全不受影響。

總結:
AbstractFactory模式有以下三個要點:
1.應對的問題是“多風格的系列對象創建”的變化問題,“系列對象”指的是這些對象之間有相互依賴或者相互作用的關系。否則使用“靜態工廠”足以。
2.抽象工廠和靜態工廠的核心是“封裝”,將對象的創建進行封裝,避免“new”引起的問題
3.抽象工程的另一個核心是“多態”,通過動態綁定來處理“不同風格”的問題

注:
AbstractFactory模式主要針對“風格”的變化,如果“對象”本身經常變化,那么該模式并不適用。


自己做的示例代碼,僅供參考
  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//這三個類對應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//這三個類對應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//這三個類對應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//對應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//對應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    //創造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    //創建Classic風格的汽車
187    carManager->createCar(new ClassicFactory());
188
189    return 0;
190}

posted on 2009-04-06 21:20 Alex@VCC 閱讀(1683) 評論(2)  編輯 收藏 引用 所屬分類: 設計模式

評論

# re: 設計模式之AbstractFactory模式 2009-04-07 09:45 匿名

void createCar(AbstractFactory *abstractFactory)
如果是這樣子的
void createCar(char* abstractFactory)
就更好了,根據字符串標志去查找對應的類工廠,是庫的任務。  回復  更多評論   

# re: 設計模式之AbstractFactory模式 2009-04-07 09:52 星綻紫輝

very good.  回復  更多評論   

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

導航

統計

常用鏈接

留言簿(5)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美亚洲第一页| 久久国产精品久久久久久电车| 日韩午夜免费| 亚洲一区二区三区777| 国产精品区一区二区三| 亚洲高清免费在线| 欧美在线观看天堂一区二区三区| 国产精品99久久久久久久久久久久| 久久久久久久欧美精品| 亚洲国产黄色| 亚洲国产精品嫩草影院| 亚洲精品免费在线| 国产精品一区二区三区四区五区| 99精品热6080yy久久| 久久成人av少妇免费| 一本色道婷婷久久欧美| 一区二区视频欧美| 国产欧美综合在线| 国产精品jizz在线观看美国| 欧美视频免费看| 欧美日韩精品福利| 亚洲视频 欧洲视频| 亚洲国产美女| 亚洲性xxxx| 亚洲一区二区黄| 99精品视频免费全部在线| 免费亚洲视频| 久久久久欧美| 伊人成人开心激情综合网| 国产精品videossex久久发布| 久久久无码精品亚洲日韩按摩| 一本色道久久88综合日韩精品 | 亚洲成人中文| 欧美精品色网| 蜜臀91精品一区二区三区| 亚洲国产精品www| 日韩视频不卡中文| 久久精品国内一区二区三区| 久久av一区二区三区漫画| 欧美大片一区二区三区| 欧美激情1区| 欧美—级a级欧美特级ar全黄| 久久成人18免费网站| 欧美第一黄网免费网站| 国产视频久久| 亚洲高清电影| 亚洲精品之草原avav久久| 99re视频这里只有精品| 亚洲一区二区三区在线观看视频| 99在线热播精品免费| 久久这里有精品15一区二区三区 | 夜夜嗨av一区二区三区四季av| 亚洲清纯自拍| 一区二区日韩伦理片| 亚洲天堂av综合网| 欧美激情一二三区| 99ri日韩精品视频| 欧美成人在线影院| 亚洲国产精品高清久久久| 久久久久九九九九| 亚洲电影下载| 久久亚洲精品一区二区| 欧美日韩免费一区二区三区视频 | 亚洲精品一区二区在线观看| 性做久久久久久| 久久久水蜜桃av免费网站| 亚洲网站啪啪| 国产日韩欧美视频在线| 欧美一区二区三区免费看| 欧美大片免费久久精品三p| 亚洲肉体裸体xxxx137| 欧美电影免费观看高清| 亚洲国产精品va在线看黑人动漫| 亚洲精品欧美在线| 欧美伦理91| 国内精品久久久久久久果冻传媒| 国产精品久久久久久久久免费桃花 | 久久免费精品日本久久中文字幕| 欧美+亚洲+精品+三区| 国产精品爽爽ⅴa在线观看| 欧美性开放视频| 亚洲女与黑人做爰| 欧美国产日韩一区二区| 日韩视频在线永久播放| 欧美日韩亚洲一区二区三区在线观看| 国产综合亚洲精品一区二| 久久久久久久久岛国免费| 久久久久久久网站| 日韩午夜中文字幕| 亚洲女优在线| 欧美日韩一区在线| 性欧美超级视频| 玖玖视频精品| 一区二区在线视频观看| 欧美激情一二三区| 国产精品久久久久久久一区探花 | 欧美亚洲自偷自偷| 欧美精品激情| 很黄很黄激情成人| 黄色成人小视频| 亚洲电影在线观看| 国产精品国产一区二区| 亚洲伦理中文字幕| 亚洲欧美国产不卡| 日韩午夜av| 久久久久国产精品一区三寸| 国产乱码精品一区二区三区五月婷| 亚洲国产精品悠悠久久琪琪| 亚洲麻豆视频| 亚洲一二区在线| 亚洲精品视频啊美女在线直播| 久久综合图片| 久久成人精品| 亚洲一级黄色片| 欧美成人精品福利| 久久久久五月天| 国产精品久久久久久久久免费桃花 | 欧美区一区二| 噜噜噜在线观看免费视频日韩| 性欧美video另类hd性玩具| 欧美性视频网站| 亚洲国产毛片完整版| 怡红院av一区二区三区| 午夜伦理片一区| 午夜亚洲性色福利视频| 亚洲欧美日韩区| 国产一区二区av| 美女福利精品视频| 国产精品美女久久久久久久| 亚洲欧美日韩一区二区在线| 噜噜噜在线观看免费视频日韩 | 麻豆成人在线| 欧美调教视频| 日韩午夜电影| 亚洲精品在线看| 免费永久网站黄欧美| 国产精品www| 亚洲欧洲在线一区| 国产精品第十页| 亚洲人成网站在线播| 亚洲精品色婷婷福利天堂| 免费在线日韩av| 欧美激情1区2区3区| 亚洲激情黄色| 欧美精品v日韩精品v韩国精品v | 欧美区国产区| 亚洲精品一区二区三区在线观看| 国产精品久久久久天堂| 99re热精品| 亚洲欧美成人在线| 国产精品一二一区| 久久成人亚洲| 欧美黄色免费| 一本久道久久久| 欧美日韩在线综合| 中文在线一区| 91久久国产精品91久久性色| 99一区二区| 亚洲欧美日韩精品久久| 欧美激情网站在线观看| 亚洲人体大胆视频| 亚洲欧美综合网| 国产真实久久| 亚洲综合久久久久| 久久九九久精品国产免费直播 | 久久久久久久久久久久久女国产乱| 亚洲精品日韩一| 欧美日韩综合另类| 午夜在线a亚洲v天堂网2018| 亚洲视频免费看| 国产精品日韩一区二区| 亚洲区免费影片| 午夜精品福利电影| 欧美午夜精品久久久久久人妖| 久久这里只有精品视频首页| 亚洲欧洲视频| 免费成人高清| 久久亚洲精品视频| 国产精品一二一区| 99re66热这里只有精品4| 久久av一区二区三区| 国产精品久久国产精品99gif| 亚洲国产精品成人一区二区 | 亚洲高清精品中出| 欧美色图首页| 免费欧美在线| 久久精品国产精品| 正在播放日韩| 亚洲激情啪啪| 亚洲视频1区| 久久久久久久波多野高潮日日| 欧美亚洲在线| 亚洲国产女人aaa毛片在线| 久久裸体视频| 亚洲一区二区黄色| 亚洲精品国产精品久久清纯直播| 亚洲欧洲三级电影| 韩国精品在线观看| 久久精品五月婷婷| 在线亚洲免费视频|