• <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ì)模式之Builder模式

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

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

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

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

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

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

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

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



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

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


            自己實(shí)現(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//對(duì)應(yīng)UML圖中的Director類
            15class HouseManager
            16{
            17public:
            18    //對(duì)House中的子部件進(jìn)行組裝,該部分被認(rèn)為相對(duì)穩(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對(duì)應(yīng)Director,construct方法對(duì)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 閱讀(2390) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式

            評(píng)論

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

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

            <2009年3月>
            22232425262728
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(5)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久精品中文字幕一区| 久久综合九色综合欧美就去吻| 久久精品人妻中文系列| 无码国内精品久久人妻| 97久久香蕉国产线看观看| 一本大道加勒比久久综合| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久国产欧美日韩精品| 国产精品热久久无码av| 久久九九兔免费精品6| 伊人久久精品线影院| 久久人人爽人人爽人人av东京热| 久久99精品国产麻豆| 久久性精品| 99久久婷婷国产一区二区| 狠狠综合久久AV一区二区三区| 国产精品久久久久久久久免费| 国产精品久久久久a影院| 成人午夜精品久久久久久久小说| 久久天天躁狠狠躁夜夜avapp| 蜜桃麻豆www久久国产精品| 97久久久久人妻精品专区 | 久久精品一区二区三区AV| 99久久国产免费福利| 精品久久久噜噜噜久久久| 色欲综合久久躁天天躁| 国产ww久久久久久久久久| 久久亚洲精品国产精品| 中文字幕无码av激情不卡久久| 久久精品国产91久久综合麻豆自制 | 久久免费国产精品| 色综合久久中文综合网| 久久久久人妻一区精品色| 久久棈精品久久久久久噜噜| 久久人人爽人人爽人人片av高请 | 色综合久久中文字幕无码| 中文字幕热久久久久久久| 久久久久青草线蕉综合超碰| 亚洲精品国精品久久99热一| 久久99这里只有精品国产| 久久久噜噜噜久久中文字幕色伊伊|