1. 程式人生 > >C#設計模式之建造者模式(Builder Pattern)

C#設計模式之建造者模式(Builder Pattern)

模式解釋: 

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

模式型別: 創造類模式

適用場景: 

       1.建立一些複雜的物件時,這些物件的內部組成構件間的建造順序是穩定的,但是物件的內部組成構件面臨著複雜的變化。

      2.要建立的複雜物件的演算法,獨立於該物件的組成部分,也獨立於組成部分的裝配方法時。

模式角色:
  • Proudct(產品類):一般是一個較為複雜的物件,也就是說建立物件的過程比較複雜,一般會有比較多的程式碼量。在本類圖中,產品類是一個具體的類,而非抽象類。實際程式設計中,產品類可以是由一個抽象類與它的不同實現組成,也可以是由多個抽象類與他們的實現組成。
  • Builder(抽象建造者):引入抽象建造者的目的,是為了將建造的具體過程交與它的子類來實現。這樣更容易擴充套件。一般至少會有兩個抽象方法,一個用來建造產品,一個是用來返回產品。
  • ConcreteBuilder(建造者):實現抽象類的所有未實現的方法,具體來說一般是兩項任務:組建產品;返回組建好的產品。
  • Director(導演類):負責呼叫適當的建造者來組建產品,導演類一般不與產品類發生依賴關係,與導演類直接互動的是建造者類。一般來說,導演類被用來封裝程式中易變的部分。

UML圖:


程式碼實現:

1.Product類, 具體的產品.

public class Product
{
    IList<string> parts = new List<string>();

    public void Add(string part)
    {
        parts.Add(part);
    }
    public void Show()
    {
        Console.WriteLine("\n產品 建立 ----");
        foreach (string part in parts)
        {
            Console.WriteLine(part);
        }
    }
}

2.Builder類, 抽象建造者.

public abstract class Builder
{
    public abstract void BuildPartA();
    public abstract void BuildPartB();
    public abstract Product GetResult();
}

3.ConcreteBuilder類, 建造者.

public class ConcreteBuilder1 : Builder
{
    private Product product = new Product();

    public override void BuildPartA()
    {
        product.Add("部件A");
    }
     public override void BuildPartB()
    {
        product.Add("部件B");
    }

    public override Product GetResult()
    {
        return product;
    }
}

public class ConcreteBuilder2 : Builder
{
    private Product product = new Product();
    public override void BuildPartA()
    {
        product.Add("部件X");
    }
     public override void BuildPartB()
    {
        product.Add("部件Y");
    }
     public override Product GetResult()
    {
        return product;
    }
}

4,Director類, 導演.

public class Director
{
    public void Construct(Builder builder)
    {
        builder.BuildPartA();
        builder.BuildPartB();
    }
}

5.客戶端呼叫. 

public class Program
{
    static void Main(string[] args)
    {
        Director director = new Director();
        Builder b1 = new ConcreteBuilder1();
        Builder b2 = new ConcreteBuilder2();

        director.Construct(b1);
        Product p1 = b1.GetResult();
        p1.Show();
        director.Construct(b2);
        Product p2 = b2.GetResult();
        p2.Show();

        Console.Read();
    }
}

建造者模式的優點:

        首先,建造者模式的封裝性很好。使用建造者模式可以有效的封裝變化,在使用建造者模式的場景中,一般產品類和建造者類是比較穩定的,因此,將主要的業務邏輯封裝在導演類中對整體而言可以取得比較好的穩定性。

        其次,建造者模式很容易進行擴充套件。如果有新的需求,通過實現一個新的建造者類就可以完成,基本上不用修改之前已經測試通過的程式碼,因此也就不會對原有功能引入風險。

建造者模式與工廠模式的區別:

       我們可以看到,建造者模式與工廠模式是極為相似的,總體上,建造者模式僅僅只比工廠模式多了一個“導演類”的角色。在建造者模式的類圖中,假如把這個導演類看做是最終呼叫的客戶端,那麼圖中剩餘的部分就可以看作是一個簡單的工廠模式了。

       與工廠模式相比,建造者模式一般用來建立更為複雜的物件,因為物件的建立過程更為複雜,因此將物件的建立過程獨立出來組成一個新的類——導演類。也就是說,工廠模式是將物件的全部建立過程封裝在工廠類中,由工廠類向客戶端提供最終的產品;而建造者模式中,建造者類一般只提供產品類中各個元件的建造,而將具體建造過程交付給導演類。由導演類負責將各個元件按照特定的規則組建為產品,然後將組建好的產品交付給客戶端。

總結:

       建造者模式與工廠模式類似,他們都是建立類模式,適用的場景也很相似。一般來說,如果產品的建造很複雜,那麼請用工廠模式;如果產品的建造更復雜,那麼請用建造者模式。