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

那誰的技術(shù)博客

感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
數(shù)據(jù)加載中……

常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之三-Builder模式

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

UML結(jié)構(gòu)圖:


適用于以下情況:

1)當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。

2)當(dāng)構(gòu)造過程必須允許被構(gòu)造的對(duì)象有不同的表示時(shí)。

抽象基類:
1)Builder:這個(gè)基類是全部創(chuàng)建對(duì)象過程的抽象,提供構(gòu)建不同組成部分的接口函數(shù)

接口:
1)Builder::BuildPartA,Builder::BuildPartB:是對(duì)一個(gè)對(duì)象不同部分的構(gòu)建函數(shù)接口,Builder的派生類來具體實(shí)現(xiàn).
另外還有一個(gè)需要注意的函數(shù),就是Director::Construct函數(shù),這個(gè)函數(shù)里面通過調(diào)用上面的兩個(gè)接口函數(shù)完成對(duì)象的構(gòu)建--也就是說各個(gè)不同部分裝配的過程都是一致的(同樣的調(diào)用的Construct函數(shù)),但是不同的構(gòu)建方式會(huì)有不同的表示(根據(jù)Builder的實(shí)際類型來決定如何構(gòu)建,也就是多態(tài))

解析:
Builder模式是基于這樣的一個(gè)情況:一個(gè)對(duì)象可能有不同的組成部分,這幾個(gè)部分的不同的創(chuàng)建對(duì)象會(huì)有不同的表示,但是各個(gè)部分之間裝配的方式是一致的.比方說一輛單車,都是由車輪車座等等的構(gòu)成的(一個(gè)對(duì)象不同的組成部分),不同的品牌生產(chǎn)出來的也不一樣(不同的構(gòu)建方式).雖然不同的品牌構(gòu)建出來的單車不同,但是構(gòu)建的過程還是一樣的(哦,你見過車輪長在車座上的么?).
也就是說,Director::Construct函數(shù)中固定了各個(gè)組成部分的裝配方式,而具體是裝配怎樣的組成部分由Builder的派生類實(shí)現(xiàn).

實(shí)現(xiàn):
Builder模式的實(shí)現(xiàn)基于以下幾個(gè)面向?qū)ο蟮脑O(shè)計(jì)原則:1)把變化的部分提取出來形成一個(gè)基類和對(duì)應(yīng)的接口函數(shù),在這里不會(huì)變化的是都會(huì)創(chuàng)建PartA和PartB,變化的則是不同的創(chuàng)建方法,于是就抽取出這里的Builder基類和BuildPartA,BuildPartB接口函數(shù) 2)采用聚合的方式聚合了會(huì)發(fā)生變化的基類,就是這里Director聚合了Builder類的指針.

1)Builder.h

/* *******************************************************************
????created:????2006/07/19
????filename:?????Builder.h
????author:????????李創(chuàng)
????????????????
http://www.shnenglu.com/converse/

????purpose:????Builder模式的演示代碼
********************************************************************
*/


#ifndef?BUILDER_H
#define ?BUILDER_H

// ?虛擬基類,是所有Builder的基類,提供不同部分的構(gòu)建接口函數(shù)
class ?Builder
{
public :
????Builder()
{} ;
????
virtual ? ~ Builder() {}

????
// ?純虛函數(shù),提供構(gòu)建不同部分的構(gòu)建接口函數(shù)
???? virtual ? void ?BuilderPartA()? = ? 0 ;
????
virtual ? void ?BuilderPartB()? = ? 0 ;
}
;

// ?使用Builder構(gòu)建產(chǎn)品,構(gòu)建產(chǎn)品的過程都一致,但是不同的builder有不同的實(shí)現(xiàn)
// ?這個(gè)不同的實(shí)現(xiàn)通過不同的Builder派生類來實(shí)現(xiàn),存有一個(gè)Builder的指針,通過這個(gè)來實(shí)現(xiàn)多態(tài)調(diào)用
class ?Director
{
public :
????Director(Builder
* ?pBuilder);
????
~ Director();

????
void ?Construct();

private :
????Builder
* ?m_pBuilder;
}
;

// ?Builder的派生類,實(shí)現(xiàn)BuilderPartA和BuilderPartB接口函數(shù)
class ?ConcreateBuilder1
????:?
public ?Builder
{
public :
????ConcreateBuilder1()
{}
????
virtual ? ~ ConcreateBuilder1() {}

????
virtual ? void ?BuilderPartA();
????
virtual ? void ?BuilderPartB();
}
;

// ?Builder的派生類,實(shí)現(xiàn)BuilderPartA和BuilderPartB接口函數(shù)
class ?ConcreateBuilder2
????:?
public ?Builder
{
public :
????ConcreateBuilder2()
{}
????
virtual ? ~ ConcreateBuilder2() {}

????
virtual ? void ?BuilderPartA();
????
virtual ? void ?BuilderPartB();
}
;

#endif


2)Builder.cpp

/* *******************************************************************
????created:????2006/07/19
????filename:?????Builder.cpp
????author:????????李創(chuàng)
????????????????
http://www.shnenglu.com/converse/

????purpose:????Builder模式的演示代碼
********************************************************************
*/


#include?
" Builder.h "
#include?
< iostream >

void ?ConcreateBuilder1::BuilderPartA()
{
????std::cout?
<< ? " BuilderPartA?by?ConcreateBuilder1\n " ;
}


void ?ConcreateBuilder1::BuilderPartB()
{
????std::cout?
<< ? " BuilderPartB?by?ConcreateBuilder1\n " ;
}


void ?ConcreateBuilder2::BuilderPartA()
{
????std::cout?
<< ? " BuilderPartA?by?ConcreateBuilder2\n " ;
}


void ?ConcreateBuilder2::BuilderPartB()
{
????std::cout?
<< ? " BuilderPartB?by?ConcreateBuilder2\n " ;
}


Director::Director(Builder
* ?pBuilder)
????:?m_pBuilder(pBuilder)
{
}


Director::
~ Director()
{
????delete?m_pBuilder;
????m_pBuilder?
= ?NULL;
}


// ?Construct函數(shù)表示一個(gè)對(duì)象的整個(gè)構(gòu)建過程,不同的部分之間的裝配方式都是一致的,
// ?首先構(gòu)建PartA其次是PartB,只是根據(jù)不同的構(gòu)建者會(huì)有不同的表示
void ?Director::Construct()
{
????m_pBuilder
-> BuilderPartA();
????m_pBuilder
-> BuilderPartB();
}


3)Main.cpp

/* *******************************************************************
????created:????2006/07/20
????filename:?????Main.cpp
????author:????????李創(chuàng)
????????????????
http://www.shnenglu.com/converse/

????purpose:????Builder模式的測(cè)試代碼
********************************************************************
*/


#include?
" Builder.h "
#include?
< stdlib.h >

int ?main()
{
????Builder
* ?pBuilder1? = ? new ?ConcreateBuilder1;
????Director?
* pDirector1? = ? new ?Director(pBuilder1);
????pDirector1
-> Construct();

????Builder
* ?pBuilder2? = ? new ?ConcreateBuilder2;
????Director?
* pDirector2? = ? new ?Director(pBuilder2);
????pDirector2
-> Construct();

????delete?pDirector1;
????delete?pDirector2;

????system(
" pause " );

????
return ? 0 ;
}

posted on 2006-07-21 13:05 那誰 閱讀(5486) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式

評(píng)論

# re: 常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之三-Builder模式  回復(fù)  更多評(píng)論   

您雖然描述的非常好,也比較容易理解,可以為什么沒有加入Product類呢?

看很多別的代碼實(shí)現(xiàn)中是有這個(gè)類的,但是加的話,又該如何補(bǔ)充呢?
2013-07-12 15:55 | 劉永

# re: 常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之三-Builder模式  回復(fù)  更多評(píng)論   

請(qǐng)針對(duì)上個(gè)問題給下回復(fù),郵箱地址:YongLiu2005@163.com 謝謝
2013-07-12 15:57 | 劉永
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲最快最全在线视频| 久久中文久久字幕| 欧美激情亚洲一区| 欧美第一黄网免费网站| 99精品欧美一区二区三区综合在线| 亚洲一区二区三区在线播放| 久久综合成人精品亚洲另类欧美| 欧美亚日韩国产aⅴ精品中极品| 在线欧美不卡| 久久深夜福利免费观看| 久久深夜福利免费观看| 亚洲精品乱码久久久久| 国产精品视频精品视频| 欧美人与性动交a欧美精品| 欧美亚洲日本网站| 亚洲精品专区| 91久久视频| 久久影院亚洲| 久久国产精品亚洲va麻豆| 99精品免费网| 一区视频在线播放| 国内外成人免费视频| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 久久综合影视| 亚洲欧美日韩第一区| 亚洲精品综合| 亚洲精品日韩在线| 黄色亚洲精品| 一区视频在线播放| 国产美女一区| 欧美视频网址| 欧美日韩在线视频观看| 欧美aa国产视频| 美女图片一区二区| 久久久久久久999| 久久九九国产| 午夜精品剧场| 亚洲性人人天天夜夜摸| 亚洲欧美精品伊人久久| 亚洲网站在线| 亚洲图片欧洲图片日韩av| 亚洲人成在线播放| 最新中文字幕一区二区三区| 欧美激情一二区| 牛牛影视久久网| 欧美xart系列在线观看| 免费视频亚洲| 亚洲高清视频在线观看| 欧美国产精品| 91久久久亚洲精品| 在线一区观看| 老司机一区二区| 国产伦精品一区二区三区照片91| 一区二区三区高清不卡| 国内精品久久久久久久影视麻豆| 麻豆精品在线观看| 国产精品久久国产精麻豆99网站| 欧美成人黄色小视频| 国产麻豆午夜三级精品| 91久久一区二区| 精品成人在线观看| 亚洲午夜在线观看| 老司机免费视频久久| 久久先锋影音| 久久久久久久综合狠狠综合| 欧美va亚洲va国产综合| 欧美日韩国产综合视频在线观看中文 | 欧美成人午夜激情在线| 亚洲女女女同性video| 男女精品网站| 欧美激情在线播放| 91久久久亚洲精品| 久久久精品一区| 久久久水蜜桃| 国产亚洲在线| 久久九九国产精品| 久久婷婷色综合| 亚洲国产婷婷香蕉久久久久久99| 久久综合网络一区二区| 亚洲午夜免费视频| 午夜精品久久久久久久| 亚洲全部视频| 欧美v国产在线一区二区三区| 亚洲调教视频在线观看| 欧美日本精品| 一区二区欧美亚洲| 亚洲黄色视屏| 亚洲乱码国产乱码精品精可以看| 国产一区二区毛片| 亚洲国产精品v| 亚洲激情中文1区| 久久精品日韩| 亚洲国产精品一区二区www在线| 亚洲一区二区三区乱码aⅴ| 久久国产直播| 欧美午夜宅男影院| 国内精品国语自产拍在线观看| 亚洲精品欧美极品| 欧美日韩在线播| 女女同性精品视频| 99精品国产在热久久下载| 亚洲欧美亚洲| 国产欧美日韩三级| 欧美区高清在线| 欧美一区不卡| 亚洲美女免费视频| 亚洲精品乱码久久久久久日本蜜臀 | 韩国一区电影| 一本色道久久综合亚洲精品不 | 日韩亚洲国产精品| 久久久青草青青国产亚洲免观| 国产精品亚洲欧美| 亚洲精品在线视频观看| 欧美激情91| 久久久福利视频| 国产精品海角社区在线观看| 亚洲精品乱码久久久久久黑人 | 亚洲国产高清视频| 久久久精品一区| 国产欧美一区二区在线观看| 午夜精品国产精品大乳美女| 91久久精品一区二区三区| 蜜臀久久99精品久久久久久9 | 亚洲高清视频在线| 久久国产精品久久精品国产| 欧美午夜视频在线观看| 日韩午夜在线电影| 免费毛片一区二区三区久久久| 亚洲综合电影| 国产精品高清一区二区三区| 99日韩精品| 日韩一级成人av| 欧美人在线视频| 一区二区日韩免费看| 亚洲丰满在线| 午夜精品视频一区| 国产精品久线观看视频| 亚洲香蕉在线观看| 99re6热在线精品视频播放速度| 久久久国产成人精品| 国内精品久久久久久久影视麻豆| 性做久久久久久免费观看欧美 | 亚洲欧美另类综合偷拍| 国产精品一区二区三区观看| 午夜精品视频在线观看| 亚洲人成网站在线播| 欧美日韩一区二区欧美激情| 在线观看亚洲| 亚洲精品永久免费| 欧美日韩p片| 在线综合视频| 亚洲精品一区二区三| 国产精品伦子伦免费视频| 亚洲一区不卡| 亚洲欧美成人网| 韩国三级在线一区| 久久免费国产| 欧美成人r级一区二区三区| 激情欧美一区| 亚洲激情视频在线播放| 欧美日韩亚洲一区| 久久精品在线播放| 老**午夜毛片一区二区三区| 在线亚洲伦理| 亚洲欧美激情精品一区二区| 在线看无码的免费网站| 亚洲成人在线视频网站| 欧美日韩一区二区视频在线| 亚欧成人精品| 欧美一区二区黄| 亚洲精品免费在线观看| 亚洲国产精品一区二区久| 国产精品美女在线观看| 久久久久久一区二区三区| 欧美日本一区| 久久国产精品99精品国产| 欧美激情偷拍| 欧美怡红院视频一区二区三区| 欧美成人日韩| 亚洲欧美日韩一区在线| 男人天堂欧美日韩| 亚洲午夜一区二区三区| 久久色在线播放| 亚洲一区999| 欧美一区免费视频| 日韩视频一区二区| 久久精品99无色码中文字幕| 日韩一级裸体免费视频| 亚洲女同同性videoxma| 99www免费人成精品| 日韩午夜剧场| 亚洲国产高清一区二区三区| 一道本一区二区| 亚洲国内欧美| 亚洲一区在线直播| 中文亚洲欧美| 久久亚洲欧美国产精品乐播| 久久成人免费网| 欧美片第1页综合| 亚洲福利在线看|