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();
}
}
現在我們來分析一下上面的例子:
2、需要生成的產品對象的屬性相互依賴,建造者模式可以強迫生成順序。
3、在對象創建過程中會使用到系統中的一些其它對象,這些對象在產品對象的創建過程中不易得到。
3、創建者中的創建子部件的接口方法不是抽象方法而是空方法,不進行任何操作,具體的創建者只需要覆蓋需要的方法就可以,但是這也不是絕對的,特別是類似文本轉換這種情況下,缺省的方法將輸入原封不動的輸出是合理的缺省操作。
using System.Text;
class Exam
{
public static void Main()
{
StringBuilder sb = new StringBuilder();
sb.Append('a',2);
sb.Append('b',3);
sb.Append('c',4);
Console.WriteLine(sb.ToString()); //打印出 aabbbcccc
sb.Remove(0, sb.Length); //清除sb中的所有信息
}
}
參考文獻
《敏捷軟件開發-原則、模式與實踐》 Robert C. Martin
《.Net與設計模式》 甄鐳
《Java與模式》 閻宏
“網絡資源”