天天看點

c#設計模式---建造者模式(Builder Pattern)

一 意圖

将一個複雜對象的建構與它的表示分離,使得同樣的建構過程可以建立不同的表示。

二 适用性

在以下情況使用Build模式:

1 當建立複雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。

2 當構造過程必須允許被構造的對象有不同的表示時。

3 Builder模式要解決的也正是這樣的問題:

  當我們要建立的對象很複雜的時候(通常是由很多其他的對象組合而成),

  我們要複雜對象的建立過程和這個對象的表示(展示)分離開來,

  這樣做的好處就是通過一步步的進行複雜對象的建構,

  由于在每一步的構造過程中可以引入參數,使得經過相同的步驟建立最後得到的對象的展示不一樣。

  在書中第一個例子RTF文檔閱讀器的實作中,可以看到文檔RTFReader支援。

c#設計模式---建造者模式(Builder Pattern)

從此圖中可以看到:

1封裝了三種複雜對象的建構:

ASCIIText,TeXText,TextWiWdget,分别對應不同的builder

2 同樣的建立過程建立不同的表示

    可以在RTFReader中對文檔進行解析的時候while循環,對于同樣的文檔,使用不同builder建立産品,同樣過程可以得到不同的表示。

3 複雜對象建構分過程進行

    在while循環中,可以看到對不同類型的文檔構件,處理的方式不同。分成不同的部分進行處理。

三 結構圖

c#設計模式---建造者模式(Builder Pattern)

四 互動過程

c#設計模式---建造者模式(Builder Pattern)

四個參與者的解釋:

  • Builder(TextConverter)

------為建立一個Product對象的各個部件指定抽象接口。

  • ConcreteBuilder(ASCIIConverter,TexConverter,TextWidgetConverter)

----實作Builder的接口以及構造和裝配該産品的各個部件。

----定義并且明确它所建立的表示

----提供一個檢索産品的接口(例如,GetASCIIText 和GetTextWidget)

  • Director(RTFReader)

----是構造一個使用Builder接口的對象

  • Product(ASCIIText,TexText,TextWidget)

----表示被構造的複雜對象。ConcreteBuilder建立該産品的内部表示并定義它的裝配過程

----包含定義組成部件的類,包括将這些部件裝配成最終産品的接口

轉載:http://www.cnblogs.com/bastard/archive/2011/11/21/2257625.html

4個角色:指揮者(Director),建造者(Builder),具體建造者(ConcreteBuilder),産品(Product)

         産品:需要建立的對象産品

         具體建造者:建立産品的執行個體并且實作建造者多個方法對産品進行裝配

         建造者:本質為抽象類,裡面的抽象方法供具體建造者重寫,聲明産品的引用

         指揮者:調用建造者抽象類以及其方法

       實作思路:用戶端建立一個指揮者,并且執行個體化需要的産品的具體建造者,然後指揮者調用具體建造者的執行個體即将産品生産出來。

 類圖:

c#設計模式---建造者模式(Builder Pattern)

        應用場景:在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是如何使用的:

        一、産品角色

c#設計模式---建造者模式(Builder Pattern)

// 産品

public 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; }

}

///   <summary>

///  記憶體大小

///   </summary>

public   string  MemorySize

{

get  {  return  m_MemorySize; }

set  { m_MemorySize  =  value; }

}

///   <summary>

///  硬碟大小

///   </summary>

public   string  DiskSize

{

get  {  return  m_DiskSize; }

set  { m_DiskSize  =  value; }

}

///   <summary>

///  顯示産品的資訊

///   </summary>

public   void  ShowComputerInfo()

{

Console.WriteLine( " ------------------------ " );

Console.WriteLine( " 電腦名稱: "   +  CompName);

Console.WriteLine( " 記憶體大小: "   +  MemorySize);

Console.WriteLine( " 硬碟大小: "   +  DiskSize);

}

}

c#設計模式---建造者模式(Builder Pattern)

        二、建造者角色

c#設計模式---建造者模式(Builder Pattern)

// 建造者 定義建造産品的抽象方法和産品的引用

public abstract   class  ComputerBuilder

{

private  Computer computerInstance;

///   <summary>

///  傳回建立的電腦産品執行個體

///   </summary>

public  Computer ComputerInstance

{

get  {  return  computerInstance; }

set  { computerInstance = value; }

}

///   <summary>

///  建立電腦名稱

///   </summary>

abstract   public   void  CreateCompName();

///   <summary>

///  建立電腦記憶體

///   </summary>

abstract   public   void  CreateCompMemory();

///   <summary>

///  建立電腦硬碟

///   </summary>

abstract   public   void  CreateCompDisk();

}

c#設計模式---建造者模式(Builder Pattern)

        三、具體建造者角色

c#設計模式---建造者模式(Builder Pattern)

// 具體建造者建立蘋果電腦

public 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 " ;

}

}

// 具體建造者建立戴爾電腦

public class  DellConcreteBuilder : ComputerBuilder

{

public   override   void  CreateCompName()

{

ComputerInstance  =   new  Computer();

ComputerInstance.CompName  =   " 戴爾電腦 " ;

}

public   override   void  CreateCompMemory()

{

ComputerInstance.MemorySize  =   " 2GB " ;

}

public   override   void  CreateCompDisk()

{

ComputerInstance.DiskSize  =   " 320GB " ;

}

}

// 具體建造者建立惠普電腦

public class  HpConcreteBuilder : ComputerBuilder

{

public   override   void  CreateCompName()

{

ComputerInstance  =   new  Computer();

ComputerInstance.CompName  =   " 惠普電腦 " ;

}

public   override   void  CreateCompMemory()

{

ComputerInstance.MemorySize  =   " 1GB " ;

}

public   override   void  CreateCompDisk()

{

ComputerInstance.DiskSize  =   " 160GB " ;

}

}

// 具體建造者建立IBM電腦

public class  IBMConcreteBuilder : ComputerBuilder

{

public   override   void  CreateCompName()

{

ComputerInstance  =   new  Computer();

ComputerInstance.CompName  =   " IBM電腦 " ;

}

public   override   void  CreateCompMemory()

{

ComputerInstance.MemorySize  =   " 2G " ;

}

public   override   void  CreateCompDisk()

{

ComputerInstance.DiskSize  =   " 1000G " ;

}

}

c#設計模式---建造者模式(Builder Pattern)

        四、指揮者角色

c#設計模式---建造者模式(Builder Pattern)

// 指揮者

public class  CreateDirector

{

///   <summary>

///  調用建造者抽象方法以生産産品

///   </summary>

///   <param name="compBuilder"></param>

public   void  CreateComputer(ComputerBuilder compBuilder)

{

compBuilder.CreateCompName();

compBuilder.CreateCompMemory();

compBuilder.CreateCompDisk();

}

}

c#設計模式---建造者模式(Builder Pattern)

最後調用使用的示例如下:

namespace BuilderPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            //建立指揮者
            CreateDirector compDirector = new CreateDirector();
            //建立具體建造者
            ComputerBuilder hpComputer = new HpConcreteBuilder();
            ComputerBuilder ibmComputer = new IBMConcreteBuilder();
            ComputerBuilder dellComputer = new DellConcreteBuilder();
            ComputerBuilder appleComputer = new AppleConcreteBuilder();

            //指揮者調用具體建造者以建立産品
            compDirector.CreateComputer(hpComputer);
            //調用産品内部函數顯示産品資訊
            hpComputer.ComputerInstance.ShowComputerInfo();


            compDirector.CreateComputer(ibmComputer);
            ibmComputer.ComputerInstance.ShowComputerInfo();

            compDirector.CreateComputer(dellComputer);
            dellComputer.ComputerInstance.ShowComputerInfo();

            compDirector.CreateComputer(appleComputer);
            appleComputer.ComputerInstance.ShowComputerInfo();

            Console.ReadLine();
        }
    }
}
           

轉載:http://www.cnblogs.com/chengxingliang/archive/2011/07/14/2105119.html

繼續閱讀