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

The Programming world of Alex

設(shè)計模式之Builder模式

Builder模式仍然屬于創(chuàng)建型模式,主要體現(xiàn)了OO中“封裝”和“多態(tài)”兩個特性。

還是引一個簡單的例子來說明Builder模式的意義。
假設(shè)我們設(shè)計的游戲中需要創(chuàng)建一個比較復(fù)雜的房屋對象,房屋對象有很多部分組成,比如說有門,窗戶,墻,地板等等。當(dāng)我們在將這個房屋實現(xiàn)之后,可能隨著需求的改變需要對門進(jìn)行更換,將原來的木門換成鐵門。這時候的問題就是:如何改變組成部分而對房屋整體不做改變?
到了這里就需要我們對房屋進(jìn)行抽象:房屋擁有門,窗戶,墻等部分,這些部分可能容易發(fā)生變化。房屋也有其穩(wěn)定的結(jié)構(gòu),這結(jié)構(gòu)就是如何將門,窗戶,墻等部分如何連接起來的算法。

上圖中引入了Builder這一概念,我們可以把他理解成為生產(chǎn)各個部件(如門,窗戶)的一個生成器(有點像之前說的工廠,但又不完全是),代碼中具體將其實現(xiàn)成為抽象類。紅線以上是相對穩(wěn)定的部分,紅線以下是相對易變的部分。其中構(gòu)建算法(即如何連接房屋中各個部件間的關(guān)系)穩(wěn)定,但部件類型依賴于Builder,Builder具體實現(xiàn)為何種方案(木門還是鐵門?)這全由多態(tài)的動態(tài)綁定機(jī)制決定(即交由客戶代碼來決定)。

動機(jī):
軟件系統(tǒng)中,有時候面臨著“一個復(fù)雜對象”的創(chuàng)建工作,其通常由各個部分的子對象用一定的算法構(gòu)成;由于需求的變化,這個復(fù)雜對象的各個部分經(jīng)常面臨劇烈變化,但將其組合在一起的算法卻相對穩(wěn)定。

意圖:
將一個復(fù)雜對象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。(GoF)

GoF給出的這個意圖相當(dāng)?shù)幕逎y懂,關(guān)鍵就在“同樣的構(gòu)建過程”和“不同的表示”。“同樣的構(gòu)建過程”就是指前面分析中的穩(wěn)定構(gòu)建算法;“不同的表示”就是不同部件組合出來的不同的對象。

設(shè)計思路:
先看UML圖

圖中Director使用Builder的對象,他的Construct方法就是“意圖”中所指的“同樣的構(gòu)建過程”,即對象的穩(wěn)定構(gòu)建算法。Builder作為參數(shù)傳入Construct以提供具體的對象對象。
而Builder類作為接口實現(xiàn),提供Product中各個部件的生成接口;ConcreteBuilder來對接口具體實現(xiàn),并有一個返回具體Product的方法GetResult。



上圖描述了客戶程序,Director類,ConcreteBuilder類如何進(jìn)行協(xié)作。首先客戶代碼確定需要何種類型的對象,創(chuàng)建相應(yīng)的ConcreteBuilder;再創(chuàng)建Director類,將ConcreteBuilder作為參數(shù)傳入;在Construct方法中創(chuàng)建對象中A,B,C三個子部分,并對這些子部分進(jìn)行合理的組織;最后通過ConcreteBuilder的GetResult方法獲得所需對象。

Builder模式和Abstract Factory模式很容易讓人混淆,因為他們都可以產(chǎn)生不同系列的對象。
但是兩者還是有本質(zhì)差別的:
1.兩者目的不同。Builder模式是為了產(chǎn)生單個復(fù)雜對象;Abstract Factory模式是為了產(chǎn)生一系列不同風(fēng)格的對象。(Builder模式也產(chǎn)生一系列對象,但他們都是復(fù)雜對象的子部分)
2.Builder模式在最后一步返回對象;Abstract Factory模式中的系列對象是立即返回的。


自己實現(xiàn)的示例代碼,僅供參考:
Main.cpp
 1//////////////////////////////////////////////////////////////////////////
 2// BuilderTest for Builder Pattern Test
 3//
 4//////////////////////////////////////////////////////////////////////////
 5
 6#include "stdafx.h"
 7#include "AbstractInfo.h"
 8#include "Builder.h"
 9#include "ModernHouse.h"
10#include "Castle.h"
11#include <iostream>
12using namespace std;
13
14//對應(yīng)UML圖中的Director類
15class HouseManager
16{
17public:
18    //對House中的子部件進(jìn)行組裝,該部分被認(rèn)為相對穩(wěn)定
19    void construct(Builder* builder)
20    {
21        builder->buildDoor();
22        builder->buildWindow();
23        builder->buildWall();
24        builder->buildFloor();
25        builder->buildCeiling();
26    }

27}
;
28
29int _tmain(int argc, _TCHAR* argv[])
30{
31    //創(chuàng)建ConcreteBuilder
32    Builder* builder = new CastleBuilder();
33    //HouseManager對應(yīng)Director,construct方法對House的子部件(門,窗戶等)進(jìn)行組裝
34    HouseManager* houseManager = new HouseManager();
35    houseManager->construct(builder);
36    //得到需要的結(jié)果(Castle) 
37    House* house = builder->getResult();
38
39    delete house;
40    delete houseManager;
41    delete builder;
42    return 0;
43}

各種抽象類,包括房屋,門,窗戶。。。
AbstracInfo.h
 1#pragma once
 2
 3class Door
 4{
 5protected:
 6    Door(){}
 7}
;
 8
 9class Window
10{
11protected:
12    Window(){}
13}
;
14
15class Wall
16{
17protected:
18    Wall(){}
19}
;
20
21class Floor
22{
23protected:
24    Floor(){}
25}
;
26
27class Ceiling
28{
29protected:
30    Ceiling(){}
31}
;
32
33class House
34{
35protected:
36    House(Door* d,Window* wd,Wall* wl,Floor* f,Ceiling* c){}
37}
;
38
39

Builder.h

 

 1#pragma once
 2#include "AbstractInfo.h"
 3
 4class Builder
 5{
 6public:
 7    virtual void buildDoor() = 0;
 8    virtual void buildWindow() = 0;
 9    virtual void buildWall() = 0;
10    virtual void buildFloor() = 0;
11    virtual void buildCeiling() = 0;
12    virtual House* getResult() = 0;
13}
;
14
15


Castle.h

  1#pragma once
  2#include "AbstractInfo.h"
  3#include "Builder.h"
  4#include <iostream>
  5using namespace std;
  6
  7class Castle : public House
  8{
  9public:
 10    Castle(Door* d,Window* wd,Wall* wl,Floor* f,Ceiling* c)
 11        :House(d,wd,wl,f,c)
 12    {
 13        cout<<"Create a Castle with Door, Window, Wall, Floor, Ceiling"<<endl;
 14    }

 15}
;
 16
 17class CastleDoor : public Door
 18{
 19public:
 20    CastleDoor()
 21    {
 22        cout<<"the Castle Door is created"<<endl;
 23    }

 24}
;
 25
 26class CastleWindow : public Window
 27{
 28public:
 29    CastleWindow()
 30    {
 31        cout<<"the Castle Window is created"<<endl;
 32    }

 33}
;
 34
 35class CastleWall : public Wall
 36{
 37public:
 38    CastleWall()
 39    {
 40        cout<<"the Castle Wall is created"<<endl;
 41    }

 42}
;
 43
 44class CastleFloor : public Floor
 45{
 46public:
 47    CastleFloor()
 48    {
 49        cout<<"the Castle Floor is created"<<endl;
 50    }

 51}
;
 52
 53class CastleCeiling : public Ceiling
 54{
 55public:
 56    CastleCeiling()
 57    {
 58        cout<<"the Castle Ceiling is created"<<endl;
 59    }

 60}
;
 61
 62class CastleBuilder : public Builder
 63{
 64private:
 65    Door* door;
 66    Window* window;
 67    Wall* wall;
 68    Floor* floor;
 69    Ceiling* ceiling;
 70public:
 71    void buildDoor()
 72    {
 73        door = new CastleDoor();
 74    }

 75    void buildWindow()
 76    {
 77        window = new CastleWindow();
 78    }

 79    void buildWall()
 80    {
 81        wall = new CastleWall();
 82    }

 83    void buildFloor()
 84    {
 85        floor = new CastleFloor();
 86    }

 87    void buildCeiling()
 88    {
 89        ceiling = new CastleCeiling();
 90    }

 91    Castle* getResult()
 92    {
 93        return new Castle(door,window,wall,floor,ceiling);
 94    }

 95    ~CastleBuilder()
 96    {
 97        if (door != NULL) { delete door;}
 98        if (window != NULL) { delete window;}
 99        if (wall != NULL) { delete wall;}
100        if (floor != NULL) { delete floor;}
101        if (ceiling != NULL) { delete ceiling;}
102    }

103}
;
104



 

posted on 2009-04-14 21:51 Alex@VCC 閱讀(2392) 評論(1)  編輯 收藏 引用 所屬分類: 設(shè)計模式

評論

# re: 設(shè)計模式之Builder模式 2009-04-15 14:28 yleesun

學(xué)習(xí)...  回復(fù)  更多評論   

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

導(dǎo)航

統(tǒng)計

常用鏈接

留言簿(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>
            亚洲图片欧美日产| 亚洲欧洲三级电影| 免费欧美日韩国产三级电影| 亚洲一二区在线| 亚洲国内自拍| 亚洲一区二区三区久久| 亚洲风情亚aⅴ在线发布| 国产欧美日韩在线视频| 国产欧美一区二区精品性色| 国产欧美精品一区二区色综合 | 亚洲午夜一区二区| 亚洲一区二区在线视频| 亚洲视频第一页| 午夜精品美女久久久久av福利| 亚洲欧美国产va在线影院| 亚洲欧美日韩在线一区| 久久―日本道色综合久久| 欧美91视频| 国产精品久久久久久久午夜片| 国产精品一区二区在线观看网站| 国产亚洲欧美日韩精品| 亚洲高清色综合| 在线一区亚洲| 久久精品视频99| 亚洲人成毛片在线播放| 亚洲一区二区四区| 狂野欧美性猛交xxxx巴西| 欧美了一区在线观看| 国产欧美另类| 亚洲美女精品久久| 久久九九电影| 日韩亚洲在线观看| 久久午夜国产精品| 国产精品三级久久久久久电影| 亚洲福利久久| 欧美亚洲色图校园春色| 亚洲大片精品永久免费| 亚洲欧美电影在线观看| 欧美激情第9页| 伊人婷婷欧美激情| 久久在线免费视频| 亚洲小说欧美另类社区| 久久久久久久久久码影片| 亚洲精品日韩精品| 久久精品中文字幕免费mv| 欧美三级网页| 亚洲国产一成人久久精品| 中文国产亚洲喷潮| 欧美激情乱人伦| 欧美呦呦网站| 国产精品系列在线播放| 亚洲一品av免费观看| 亚洲国产女人aaa毛片在线| 欧美亚洲尤物久久| 国产精品网站在线| 亚洲福利视频网| 久久综合给合| 久久久五月天| 尹人成人综合网| 久久只有精品| 久久久久一区| 伊人蜜桃色噜噜激情综合| 久久精品国产99国产精品| 亚洲婷婷在线| 国产精品久久亚洲7777| 一区二区三区高清不卡| 亚洲人久久久| 欧美激情一区| 日韩一级精品| 亚洲精品一区在线| 欧美区一区二区三区| 亚洲精品国产欧美| 亚洲福利视频二区| 欧美激情一区二区三区成人| 亚洲精品系列| 亚洲精品女人| 欧美大片在线看| 日韩视频在线免费观看| 亚洲精品小视频在线观看| 欧美人牲a欧美精品| 一本在线高清不卡dvd | 久久久国产视频91| 久久国产精品72免费观看| 国产综合第一页| 麻豆精品国产91久久久久久| 久久免费的精品国产v∧| 亚洲理论在线| 亚洲香蕉伊综合在人在线视看| 亚洲影视综合| 国产精品揄拍500视频| 久久天堂成人| 欧美激情国产高清| 亚洲欧美一区二区原创| 久久xxxx| 亚洲免费高清视频| 亚洲欧美另类在线观看| 在线看视频不卡| 日韩一级黄色av| 国语自产精品视频在线看8查询8| 亚洲精品视频一区| 正在播放欧美一区| 中文精品一区二区三区| 国产欧美精品日韩区二区麻豆天美| 久久久91精品| 欧美精品一级| 久久成人免费日本黄色| 欧美激情精品久久久久久久变态| 欧美一区二区久久久| 美女视频网站黄色亚洲| 亚洲欧美一区二区精品久久久| 久久久久综合| 午夜老司机精品| 欧美xxx在线观看| 久久久久91| 国产精品成人观看视频国产奇米| 久久综合国产精品台湾中文娱乐网| 欧美另类女人| 免费成人小视频| 亚洲欧美中文日韩在线| 99国产精品久久久久久久成人热| 小黄鸭精品aⅴ导航网站入口| 亚洲精品一区二区三区婷婷月| 性娇小13――14欧美| 在线视频欧美日韩| 欧美成人午夜影院| 欧美gay视频| 影音先锋一区| 久久精品人人做人人爽电影蜜月| 午夜久久久久| 国产噜噜噜噜噜久久久久久久久| 99在线观看免费视频精品观看| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲精品一区二区三| 久久综合九色九九| 久久一区二区三区av| 国产一区二区三区精品欧美日韩一区二区三区| 日韩手机在线导航| 亚洲综合成人婷婷小说| 国产精品v亚洲精品v日韩精品| 亚洲另类春色国产| 99精品热视频只有精品10| 欧美精品一区二区视频 | 亚洲一区二区三区免费视频| 亚洲精品字幕| 欧美影院视频| 午夜在线电影亚洲一区| 久久久青草青青国产亚洲免观| 亚洲理论在线观看| 久久久久国产精品一区三寸| 免费亚洲婷婷| 欧美v亚洲v综合ⅴ国产v| 亚洲欧美日韩国产综合在线| 欧美日韩国产小视频| 久久综合九色综合欧美狠狠| 国产精品福利片| 亚洲伦理在线| 亚洲女同精品视频| 欧美黄色影院| 亚洲丶国产丶欧美一区二区三区 | 亚洲国产影院| 亚洲二区在线| 一本久道久久久| 欧美中在线观看| 国产精品美女www爽爽爽视频| 亚洲精品日韩在线| 一本一道久久综合狠狠老精东影业 | 亚洲免费不卡| 亚洲精品美女在线观看播放| 久久三级视频| 女人天堂亚洲aⅴ在线观看| 在线观看视频日韩| 久久综合久久美利坚合众国| 老巨人导航500精品| 99在线热播精品免费| 国产亚洲成精品久久| 欧美激情国产日韩精品一区18| 91久久精品国产91久久性色tv | 久久狠狠一本精品综合网| 亚洲午夜视频在线观看| 国产精品一区一区| 欧美亚洲三级| 毛片精品免费在线观看| 一区在线观看视频| 国产精品高清免费在线观看| 亚洲欧美日韩精品久久| 久久一二三国产| 91久久黄色| 国产视频亚洲| 免费永久网站黄欧美| 日韩视频一区二区在线观看 | 一本色道久久综合亚洲精品不 | 99视频日韩| 亚洲电影下载| 欧美视频久久| 欧美在线亚洲一区| 亚洲国产高潮在线观看| 久久福利毛片| 99v久久综合狠狠综合久久| 国产精品视频免费| 蜜臀a∨国产成人精品|