建造者模式-Builder Pattern

設計模式系列

建造者模式:將一個複雜物件的構建與它的表示分離,使得同樣的建構過程
                     可以建立不同的表示,建造者模式是一種物件建立型模式。

       建造者模式是一步一步建立一個複雜物件,予許使用者通過指定複雜物件的型別
和內容可以構建它們,使用者不需要知道內部具體建造細節。

Builder-抽象建造者:建立一個產品Product物件的各個部件指定抽象介面,在該介面中一般宣告兩類方法,
                                 一類方法是buildPartX(),它們用於建立複雜物件的各個部件;另一類方法是getResult(),
                                 它們用於返回複雜物件。Builder既可以是抽象類,也可以是介面。

ConcreteBuilder-具體建造者:它實現了Builder介面,實現各個部件的具體構造和裝配方法,定義並明確它所建
                                                 立的複雜物件,也可以提供一個方法返回建立好的複雜產品物件。

●Product-產品角色:它是被構建的複雜物件,包含多個組成部件,具體建造者建立該產品的內部表示並定義它
                                  的裝配過程。

Director-指揮者:指揮者又稱為導演類,它負責安排複雜物件的建造次序,指揮者與抽象建造者之間存在關聯
                            關係,可以在其construct()建造方法中呼叫建造者物件的部件構造與裝配方法,完成複雜物件
                            的建造。客戶端一般只需要與指揮者進行互動,在客戶端確定具體建造者的型別,並例項化
                            具體建造者物件(也可以通過配置檔案和反射機制),然後通過指揮者類的建構函式或者
                            Setter方法將該物件傳入指揮者類中。

 

    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();
            


        }
    }

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

        }
    }

    abstract class Builder
    {
        public abstract void BuildPartA();

        public abstract void BuildPartB();

        public abstract Product GetResult();

    }

    class ConcreteBuilder1:Builder
    {
        Product product = new Product();
        public override void BuildPartA()
        {
            product.Add("PartA");
        }

        public override void BuildPartB()
        {
            product.Add("PartB");
        }

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

    class ConcreteBuilder2:Builder
    {
        Product product = new Product();
        public override void BuildPartA()
        {
            product.Add("PartX");
        }
        public override void BuildPartB()
        {
            product.Add("PartY");
        }
        public override Product GetResult()
        {
            return product;
        }
    }
    class Product
    {
        List<string> parts = new List<string>();
        public void Add(string part)
        {
            parts.Add(part);
        }

        public void Show()
        {
            Console.WriteLine("\nProduct Parts ----");
            foreach (var part in parts)
            {
                Console.WriteLine(part);
            }
        }
    }


優點:
1.客戶端程式不必知道產品內部組成細節,產品本身予產品創建過程解耦,使得相同創建過程創造不同產品物件
2.每一個建造者都是獨立與其他建造者無關,可以替換具體建造者或新增一個具體建造者,用戶使用不同的具體建造者
   可得到不同產品對象
3.可以更加精細地控制產品創建過程
4.增加具體建造者無須修改原有代碼,只會遮類別針對抽象建造類,系統擴展方便,符合閉關原則

缺點:
1.建造者模式所創建的產品一般具有較多共同點,組成類似,產品之間差異很大不合適使用建造者模式,使用範圍
   受到限制
2.如果產品內部變化複雜,可能定義更多具體建造者來實現這種變化,會讓系統變的龐大

 

元哥的筆記