日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

白话设计模式——Builder

發(fā)布時(shí)間:2024/9/20 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 白话设计模式——Builder 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

生成器模式,用于創(chuàng)建復(fù)雜對(duì)象。當(dāng)我們的軟件系統(tǒng)中出現(xiàn)了這樣的情況時(shí)——我們需要一個(gè)比較復(fù)雜的對(duì)象,它的外觀(接口)我們是知道的,但是他的組成(各種各樣的組成)我們并不關(guān)心,而且他的構(gòu)造過程(比如先后順序)我們也不關(guān)心——這時(shí),我們就需要用到Builder模式了。

還是拿廣本來打比方。廣本的四個(gè)車間,最開頭的是沖壓科,而在沖壓科的門口有一間小房子,里面放了一臺(tái)激光焊接機(jī),它用它的機(jī)械手臂抓起旁邊放著的各種各樣的鋼板,不停的焊接。可能有人要問,這是什么例子?這就是生成器!一般來說,汽車各處外殼的厚度以及硬度是不同的,比如車頭部分就要夠硬(用來撞的^_^),其他一些地方比如車頂就沒有必要用超厚的鋼板。這樣,一來可以降低整車的質(zhì)量,可以省油;二來可以降低成本(所以廣本暴利啊~~其實(shí)其他汽車廠家也這么干)先前所講的焊接機(jī)就是干這個(gè)事情的,它將各種不同厚度不同硬度的鋼板焊接在一起,供那些巨型的沖壓機(jī)來沖壓成型,以生產(chǎn)汽車的各個(gè)不同的部分。各種汽車所使用的合成鋼板的組成是不一樣的,但沖壓機(jī)不管那么多,它只管壓鋼板。這樣一來就明白了吧?焊接機(jī)將各種鋼板按照規(guī)定焊接成不同組成的合成鋼板,至于它是如何焊接的以及合成鋼板的組成,沖壓機(jī)對(duì)這些信息是不關(guān)心的。

我們來看一個(gè)類圖。



?

?

這張簡(jiǎn)單的類圖跟《設(shè)計(jì)模式》書中有顯著的不同。因?yàn)槲抑饕怯脕碚f明上面的例子的,跟書中提及的例子不同。這個(gè)圖中,焊接機(jī)由焊接程序控制,以生產(chǎn)不同規(guī)格的鋼板,沖壓機(jī)僅僅是調(diào)用焊接機(jī)的GetSteel方法來獲得焊好的鋼板。其實(shí),這樣的情況在我們平時(shí)的程序中用得更多一些,即某一個(gè)類僅僅是要得到一個(gè)產(chǎn)品,而產(chǎn)品的一切信息它均不知曉。當(dāng)我們需要另外一種規(guī)格的鋼板時(shí),更換相應(yīng)的程序就可以了。

MS給我們的類庫(kù)中,有一個(gè)叫做StringBuilder的類,這就是一個(gè)例子。我們給它不同的字符串或是其他對(duì)象(這些就可以看作是原材料),根據(jù)我們輸入的順序(組裝過程),我們可以得到我們想要的一個(gè)字符串。

把這個(gè)類圖串換成代碼(這個(gè)代碼實(shí)在不怎么樣,還好,這只是一個(gè)說明,如果我在工作中寫出這樣的東西來,我就可以體驗(yàn)一下從17樓飛下的感覺了,^_^

Builder
????public?class?Steel
????
{
????????
public?object?Part00;
????????
public?object?Part01;
????????
public?object?Part10;
????????
public?object?Part11;
????}


????
public?class?WeldingProgramme
????
{
????????
object[]?_materials;
????????
public?WeldingProgramme()
????????
{
????????????
this._materials?=?new?object[4];

????????????
//?TODO:?Add?some?materials
????????}

????????
public?Steel?Go()
????????
{
????????????SteelWelder?sw?
=?new?SteelWelder();
????????????
foreach(object?m?in?this._materials)
????????????
{
????????????????sw.WeldSteel(m);
????????????}


????????????
//????you?can?weld?the?steel?like?this
????????????
//????sw.WeldSteel(this._materials[3]);
????????????
//????sw.WeldSteel(this._materials[2]);
????????????
//????sw.WeldSteel(this._materials[1]);
????????????
//????sw.WeldSteel(this._materials[0]);


????????????
//????also,?you?can?do?it?like?this
????????????
//????sw.WeldSteel(this._materials[2]);
????????????
//????sw.WeldSteel(this._materials[1]);
????????????
//????sw.WeldSteel(this._materials[0]);
????????????
//????sw.WeldSteel(this._materials[3]);

????????????
return?sw.GetSteel();
????????}

????}


????
public?class?SteelWelder
????
{
????????Steel?_steel;
????????
public?void?WeldSteel(object?materials)
????????
{
????????????
if(this._steel?==?null)
????????????????
this._steel?=?new?Steel();
????????????
if(this._steel.Part00?==?null)
????????????
{
????????????????
this._steel.Part00?=?materials;
????????????}

????????????
else?if(this._steel.Part01?==?null)
????????????
{
????????????????
this._steel.Part01?=?materials;
????????????}

????????????
else?if(this._steel.Part10?==?null)
????????????
{
????????????????
this._steel.Part10?=?materials;
????????????}

????????????
else?if(this._steel.Part11?==?null)
????????????
{
????????????????
this._steel.Part11?=?materials;
????????????}

????????????
else
????????????
{
????????????????
throw?new?Exception("what?do?you?want?");
????????????}

????????}

????????
public?Steel?GetSteel()
????????
{
????????????
return?this._steel;
????????}

????}


????
public?class?Punch
????
{
????????
private?Steel?_steel;

????????
public?void?Work()
????????
{
????????????WeldingProgramme?wp?
=?new?WeldingProgramme();
????????????
this._steel?=?wp.Go();

????????????
//?TODO:?Punch?the?Steel
????????}

????}

?

從類圖以及代碼實(shí)例中,我們看到Builder的一些優(yōu)勢(shì)了。在我們需要不同的原料以生產(chǎn)不同的產(chǎn)品時(shí),不用更改一大片的代碼,僅僅更改指導(dǎo)Builder工作的向?qū)Ь涂梢粤恕T诒纠?#xff0c;也就是更改焊接程序,根本不會(huì)有什么產(chǎn)品的抽象類。我們當(dāng)然也可以實(shí)現(xiàn)一個(gè)Builder的父類,以實(shí)現(xiàn)更多的產(chǎn)品的制造。

生成器模式主要用的地方就是組合一些比較復(fù)雜的產(chǎn)品,而且這個(gè)產(chǎn)品的組合方式是多種多樣的。


回到目錄
上一篇:Abstract Factory
下一篇:Factory Method

總結(jié)

以上是生活随笔為你收集整理的白话设计模式——Builder的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。