模式設計c#--創建型--Builder
| 名稱 | Builder |
| 結構 |
|
| 意圖 | 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 |
| 適用性 |
|
Code Example
namespace?Builder_DesignPattern

{
????using?System;
????//?These?two?classes?could?be?part?of?a?framework,
????//?which?we?will?call?DP
????//?===============================================
????
????class?Director?
????
{
????????public?void?Construct(AbstractBuilder?abstractBuilder)
????????
{
????????????abstractBuilder.BuildPartA();
????????????if?(1==1?)?//represents?some?local?decision?inside?director
????????????
{
????????????????abstractBuilder.BuildPartB();????????????
????????????}
????????????abstractBuilder.BuildPartC();????????????
????????}
????}
????abstract?class?AbstractBuilder?
????
{
????????abstract?public?void?BuildPartA();
????????abstract?public?void?BuildPartB();
????????abstract?public?void?BuildPartC();
????}
????//?These?two?classes?could?be?part?of?an?application?
????//?=================================================
????class?ConcreteBuilder?:?AbstractBuilder?
????
{
????????override?public?void?BuildPartA()
????????
{
????????????//?Create?some?object?here?known?to?ConcreteBuilder
????????????Console.WriteLine("ConcreteBuilder.BuildPartA?called");
????????}
????????????????
????????override?public?void?BuildPartB()
????????
{
????????????//?Create?some?object?here?known?to?ConcreteBuilder
????????????Console.WriteLine("ConcreteBuilder.BuildPartB?called");
????????}
????????
????????override?public?void?BuildPartC()
????????
{
????????????//?Create?some?object?here?known?to?ConcreteBuilder
????????????Console.WriteLine("ConcreteBuilder.BuildPartC?called");
????????}
????}????

????/**////?<summary>
????///????Summary?description?for?Client.
????///?</summary>
????public?class?Client
????
{
????????public?static?int?Main(string[]?args)
????????
{
????????????ConcreteBuilder?concreteBuilder?=?new?ConcreteBuilder();
????????????Director?director?=?new?Director();
????????????director.Construct(concreteBuilder);
????????????return?0;
????????}
????}
}
一、?建造者(Builder)模式
建造者模式可以將一個產品的內部表象與產品的生成過程分割開來,從而可以使一個建造過程生成具有不同的內部表象的產品對象。
對象性質的建造
有些情況下,一個對象會有一些重要的性質,在它們沒有恰當的值之前,對象不能作為一個完整的產品使用。比如,一個電子郵件有發件人地址、收件人地址、主題、內容、附錄等部分,而在最起碼的收件人地址未被賦值之前,這個電子郵件不能發出。
有些情況下,一個對象的一些性質必須按照某個順序賦值才有意義。在某個性質沒有賦值之前,另一個性質則無法賦值。這些情況使得性質本身的建造涉及到復雜的商業邏輯。
這時候,此對象相當于一個有待建造的產品,而對象的這些性質相當于產品的零件,建造產品的過程就是組合零件的過程。由于組合零件的過程很復雜,因此,這些"零件"的組合過程往往被"外部化"到一個稱作建造者的對象里,建造者返還給客戶端的是一個全部零件都建造完畢的產品對象。
命名的考慮
之所以使用"建造者"而沒有用"生成器"就是因為用零件生產產品,"建造"更為合適,"創建"或"生成"不太恰當。
二、?Builder模式的結構:
?
建造者(Builder)角色:給出一個抽象接口,以規范產品對象的各個組成成分的建造。一般而言,此接口獨立于應用程序的商業邏輯。模式中直接創建產品對象的是具體建造者(ConcreteBuilder)角色。具體建造者類必須實現這個接口所要求的方法:一個是建造方法,另一個是結果返還方法。
具體建造者(Concrete Builder)角色:擔任這個角色的是于應用程序緊密相關的類,它們在應用程序調用下創建產品實例。這個角色主要完成的任務包括:
- 實現Builder角色提供的接口,一步一步完成創建產品實例的過程。
- 在建造過程完成后,提供產品的實例。
指導者(Director)角色:擔任這個角色的類調用具體建造者角色以創建產品對象。導演者并沒有產品類的具體知識,真正擁有產品類的具體知識的是具體建造者對象。
產品(Product)角色:產品便是建造中的復雜對象。
指導者角色是于客戶端打交道的角色。導演者角色將客戶端創建產品的請求劃分為對各個零件的建造請求,再將這些請求委派給具體建造者角色。具體建造者角色是做具體建造工作的,但卻不為客戶端所知。
三、?程序舉例:
該程序演示了Builder模式一步一步完成構件復雜產品的過程。用戶可以控制生成過程以及生成不同對象。
//?Builder?pattern?--?Structural?example??
using?System;
using?System.Collections;
//?"Director"
class?Director

{
??//?Methods
??public?void?Construct(?Builder?builder?)
??
{
????builder.BuildPartA();
????builder.BuildPartB();
??}
}
//?"Builder"
abstract?class?Builder

{
??//?Methods
??abstract?public?void?BuildPartA();
??abstract?public?void?BuildPartB();
??abstract?public?Product?GetResult();
}
//?"ConcreteBuilder1"
class?ConcreteBuilder1?:?Builder

{
??//?Fields
??private?Product?product;
??//?Methods
??override?public?void?BuildPartA()
??
{
????product?=?new?Product();
????product.Add(?"PartA"?);
??}
??override?public?void?BuildPartB()
??
{
????product.Add(?"PartB"?);
??}
??override?public?Product?GetResult()
??
{
????return?product;
??}
}
//?"ConcreteBuilder2"
class?ConcreteBuilder2?:?Builder

{
??//?Fields
??private?Product?product;
??//?Methods
??override?public?void?BuildPartA()
??
{
????product?=?new?Product();
????product.Add(?"PartX"?);
??}
??override?public?void?BuildPartB()
??
{
????product.Add(?"PartY"?);
??}
??override?public?Product?GetResult()
??
{
????return?product;
??}
}
//?"Product"
class?Product

{
??//?Fields
??ArrayList?parts?=?new?ArrayList();
?
??//?Methods
??public?void?Add(?string?part?)
??
{
????parts.Add(?part?);
??}
??public?void?Show()
??
{
????Console.WriteLine(?" Product?Parts?-------"?);
????foreach(?string?part?in?parts?)
??????Console.WriteLine(?part?);
??}
}

/**////?<summary>
///?Client?test
///?</summary>
public?class?Client

{
??public?static?void?Main(?string[]?args?)
??
{
????//?Create?director?and?builders
????Director?director?=?new?Director(?);
????Builder?b1?=?new?ConcreteBuilder1();
????Builder?b2?=?new?ConcreteBuilder2();
????//?Construct?two?products
????director.Construct(?b1?);
????Product?p1?=?b1.GetResult();
????p1.Show();
????director.Construct(?b2?);
????Product?p2?=?b2.GetResult();
????p2.Show();
??}
}posted on 2006-01-03 14:47 夢在天涯 閱讀(953) 評論(2) 編輯 收藏 引用 所屬分類: Design pattern

