4個角色:指揮者(Director),建造者(Builder),具體建造者(ConcreteBuilder),産品(Product)
産品:需要建立的對象産品
具體建造者:建立産品的執行個體并且實作建造者多個方法對産品進行裝配
建造者:本質為抽象類,裡面的抽象方法供具體建造者重寫,聲明産品的引用
指揮者:調用建造者抽象類以及其方法
實作思路:用戶端建立一個指揮者,并且執行個體化需要的産品的具體建造者,然後指揮者調用具體建造者的執行個體即将産品生産出來。
類圖:
<a target="_blank" href="http://blog.51cto.com/attachment/201204/131213655.gif"></a>
應用場景:在Silverlight中我們需要生産一列多行的輸入 框+TextBlock的組合,但是這些輸入框的類型不同,有一些隻能輸入256個字元,有的隻能輸入20個字元,還有的是多行的,有的是單行的輸入框。 這些輸入框的種類是固定的,但是可能使用者自定義輸入框的時候我們生成的順序和各自的生成數量不知道。
分析:在這裡産品是固定的,有A,B,C,D,E,F六種輸入 框+TextBlock,使用者可能生成的情況是A,A,C,C,B,B,C、也可能是B,C,D,B,C,F。這裡我們使用建造者模式,這幾種輸入框基本 上都差不多,都是TextBlock+TextBox的模式。但是可輸入數量和是否多行是不定的,那麼我們實作 AConcreteBuilder,BConcreteBuilder,CConcreteBuilder,DConcreteBuilder,EConcreteBuilder,FConcreteBuilder 等多個具體建造者,然後對于建造者中隻需要兩個方法分别執行個體化産品,并且對産品的屬性(可輸入字元數、是否可多行)進行設定,然後再使用者需要調用什麼産品 的時候,使用指揮者調用想要的ConcreteBuilder具體建造者即可。
下面我們以一個電腦産品生産的執行個體來具體看看Builder Pattern是如何使用的:
一、産品角色
//産品
class Computer
{
private string m_CompName;
private string m_MemorySize;
private string m_DiskSize;
/// <summary>
/// 電腦名稱
/// </summary>
public string CompName
get { return m_CompName; }
set { m_CompName = value; }
}
/// 記憶體大小
public string MemorySize
get { return m_MemorySize; }
set { m_MemorySize = value; }
/// 硬碟大小
public string DiskSize
get { return m_DiskSize; }
set { m_DiskSize = value; }
/// 顯示産品的資訊
public void ShowComputerInfo()
Console.WriteLine("------------------------");
Console.WriteLine("電腦名稱:" + CompName);
Console.WriteLine("記憶體大小:" + MemorySize);
Console.WriteLine("硬碟大小:" + DiskSize);
二、建造者角色
//建造者 定義建造産品的抽象方法和産品的引用
abstract class ComputerBuilder
private Computer computerInstance;
/// 傳回建立的電腦産品執行個體
public Computer ComputerInstance
get { return computerInstance; }
set { computerInstance=value; }
/// 建立電腦名稱
abstract public void CreateCompName();
/// 建立電腦記憶體
abstract public void CreateCompMemory();
/// 建立電腦硬碟
abstract public void CreateCompDisk();
三、具體建造者角色
//具體建造者建立蘋果電腦
class AppleConcreteBuilder : ComputerBuilder
public override void CreateCompName()
ComputerInstance = new Computer();
ComputerInstance.CompName = "蘋果電腦";
public override void CreateCompMemory()
ComputerInstance.MemorySize = "4G";
public override void CreateCompDisk()
ComputerInstance.DiskSize = "500G";
//具體建造者建立戴爾電腦
class DellConcreteBuilder : ComputerBuilder
ComputerInstance.CompName = "戴爾電腦";
ComputerInstance.MemorySize = "2GB";
ComputerInstance.DiskSize = "320GB";
//具體建造者建立惠普電腦
class HpConcreteBuilder : ComputerBuilder
ComputerInstance.CompName = "惠普電腦";
ComputerInstance.MemorySize = "1GB";
ComputerInstance.DiskSize = "160GB";
//具體建造者建立IBM電腦
class IBMConcreteBuilder : ComputerBuilder
ComputerInstance.CompName = "IBM電腦";
ComputerInstance.MemorySize = "2G";
ComputerInstance.DiskSize = "1000G";
四、指揮者角色
//指揮者
class CreateDirector
/// 調用建造者抽象方法以生産産品
/// <param name="compBuilder"></param>
public void CreateComputer(ComputerBuilder compBuilder)
compBuilder.CreateCompName();
compBuilder.CreateCompMemory();
compBuilder.CreateCompDisk();
本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/826743