建造者模式

簡介:

              抽象工廠模式解決了“多系列產品”的需求變化,而建造者模式解決的是 “產品部分” 的需要變化。更適用於產品內部的劇烈變化但是實現產品的最終順序一致。StringBuilder類,它就是一個建造者模式的實現。建造者模式有四個角色:建造者,具體的建造者,指導者,產品角色。

優點

1.可以使客戶端不必知道產品內部組成的細節。

2.具體的建造者類之間是相互獨立的,容易擴展。

3.由於具體的建造者是獨立的,因此可以對建造過程逐步細化,而不對其他的模塊產生任何影響。

缺點 大量新增產品時會產生多餘的Build對象以及Director類。
特點

 

1.不同Builder的相同的方法,內部實現不一樣,產生不同的事件結果時。

2.對於Director,這些對象的內部組成構件間的建造順序是穩定的,但是對象的內部組成構件面臨着複雜的變化。

抽象建造者角色(Builder) 爲創建一個Product對象的各個部件指定抽象接口,以規範產品對象的各個組成部分的建造。一般而言,此角色規定要實現複雜對象的哪些部件的創建,並不涉及具體的對象部件的創建。
具體建造者(ConcreteBuilder)

1.繼承Builder類,即實現抽象建造者角色Builder的方法。

2.具體化組件以實現方法的創建。

3.返回產品角色的實例。

指導者(Director) 調用具體建造者角色以創建產品對象的各個部分。指導者並沒有涉及具體產品類的信息,真正擁有具體產品的信息是具體建造者。
產品角色(Product) 建造中的複雜對象。它要包含那些定義組件的類,包括將這些組件裝配成產品的接口。

 

使用:

    //指導者類
    public class Director
    {
        public void Construct(IBuilder builder)
        {
            builder.GetDraw();
            builder.GetPrint();
        }
    }

    //產品類
    public sealed class Shape
    {
        //組件
        private List<string> parts = new List<string>();
        public void Prepare(string part)
        {
            parts.Add(part);
        }
        public void Finish()
        {
            foreach (string str in parts)
            {
                //do something
            }
        }
    }

    //建造者抽象類
    public abstract class IBuilder
    {
        public abstract void GetDraw();
        public abstract void GetPrint();

        public abstract Shape GetShape();
    }

    //繼承建造者類 ==》 具體建造者
    public class SquareBuilder : IBuilder
    {
        Shape shape = new Shape();
        public override void GetDraw()
        {
            shape.Prepare("Pen");
            shape.Prepare("Ruler");
        }

        public override void GetPrint()
        {
            shape.Prepare("Paper");
        }
        public override Shape GetShape()
        {
            return shape;
        }
    }

    //繼承建造者類 ==》 具體建造者
    public class CircleBuilder : IBuilder
    {
        Shape shape = new Shape();
        public override void GetDraw()
        {
            shape.Prepare("Pen");
            shape.Prepare("Dividers");
        }
        public override void GetPrint()
        {
            shape.Prepare("Paper");
        }
        public override Shape GetShape()
        {
            return shape;
        }
    }
            //建造者模式調用
            Director director = new Director();           //實例指導者

            IBuilder builderSquare = new SquareBuilder(); //實例建造者
            director.Construct(builderSquare);            //實現具體建造者的內部操作
            Shape shapeSquare = builderSquare.GetShape(); //獲取一個建造後的產品類
            shapeSquare.Finish();                         //完成一個產品的創建

            IBuilder builderCircle = new CircleBuilder();
            director.Construct(builderCircle);
            Shape shapeCircle = builderCircle.GetShape();
            shapeCircle.Finish();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章