大話設計模式-Study-Tips-第九章-建造者模式(c++&c#)

一、UML圖

二、包含的角色

Product類,具體產品類,通常由多個部件組成。是個複雜的對象。

Builder類,抽象建造者類,確定產品由若干個部件組成,並聲明一個得到此產品建造完成後的產品的接口方法。

ConcreteBuilder類,具體建造者。實現抽象建造者接口。也就是此產品的各個部件的具體構建方式。

Director類,指揮者類。使用建造者接口的類。控制產品內部部件構造的順序,組成方式等。

三、特點

建造者模式(Builder),將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

用戶只需指定需要建造的類型就可以得到它們,而不需要知道建造的過程和細節。

建造者模式主要用於創建一些複雜的對象,這些對象內部構建間的建造順序通常是穩定的,但對象內部的構建通常面臨着複雜的變化。通過建造者模式,使得建造代碼和表示代碼分離,由於建造者隱藏了該產品的組裝過程,所以若要改變一個產品內部的表示,只需要定義一個具體的建造者就行了。

四、代碼實現

c#

Product類

public class Product {
    public void ShowProduct() {
        // TODO implement here
    }

    public void SetPartA() {
        // TODO implement here
    }

    public void SetPartB() {
        // TODO implement here
    }
}

Builder類


public abstract class Builder
{
    protected Product product = new Product();
    public abstract void BuildPartA();
    public abstract void BuildPartB();
    public abstract Product GetProduct();
}

ConcreteBuilder類


public class ConcreteBuilder : Builder {
    public override void BuildPartA() {
        product.SetPartA();
    }

    public override void BuildPartB() {
        product.SetPartB();
    }

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

Director類


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

front end 

    Director director ;
    ConcreteBuilder b;

    director.ConstructProduct(b);
    Product p = b.GetProduct();
    p.ShowProduct();

c++

Product類

class Product
{
  public:
    void ShowProduct()
    {
    }
    void SetPartA()
    {
    }
    void SetPartB()
    {
    }
};

Builder類

class Builder
{
public:
    virtual void BuildPartA() = 0;

    virtual void BuildPartB() = 0;

    virtual Product GetProduct() = 0;

protected:
    Product product_;
};

ConcreteBuilder類

class ConcreteBuilder : public Builder
{
  public:
    void BuildPartA() override
    {
       product_.SetPartA();
    }

    void BuildPartB() override
    {
       product_.SetPartB();
    }

    Product GetProduct() override
    {
        return product_;
    }
};

Director類

class Director
{
  public:
    void ConstructProduct(Builder *builder)
    {
        builder->BuildPartA();
        builder->BuildPartB();
    }
};

front end 

    Director director ;
    ConcreteBuilder b;

    director.ConstructProduct(&b);
    Product p = b.GetProduct();
    p.ShowProduct();

 

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