天天看點

建造者模式(生成器模式)

執行個體:

畫小人

UML類圖:

建造者模式(生成器模式)

執行個體實作代碼:

abstract class PersonBuilder
{
    protected Graphics g;
    protected Pen p;

    public PersonBuilder(Graphics g, Pen p)
    {
        this.g = g;
        this.p = p;
    }

    public abstract void BuildHead();
    public abstract void BuildBody();
    public abstract void BuildArmLeft();
    public abstract void BuildArmRight();
    public abstract void BuildLegLeft();
    public abstract void BuildLegRight();
}

class PersonThinBuilder : PersonBuilder
{
    public PersonThinBuilder(Graphics g, Pen p)
        : base(g, p)
    { }

    public override void BuildHead()
    {
        g.DrawEllipse(p, 50, 20, 30, 30);
    }

    public override void BuildBody()
    {
        g.DrawRectangle(p, 60, 50, 10, 50);
    }

    public override void BuildArmLeft()
    {
        g.DrawLine(p, 60, 50, 40, 100);
    }

    public override void BuildArmRight()
    {
        g.DrawLine(p, 70, 50, 90, 100);
    }

    public override void BuildLegLeft()
    {
        g.DrawLine(p, 60, 100, 45, 150);
    }

    public override void BuildLegRight()
    {
        g.DrawLine(p, 70, 100, 85, 150);
    }
}

class PersonFatBuilder : PersonBuilder
{
    public PersonFatBuilder(Graphics g, Pen p)
        : base(g, p)
    { }

    public override void BuildHead()
    {
        g.DrawEllipse(p, 50, 20, 30, 30);
    }

    public override void BuildBody()
    {
        g.DrawEllipse(p, 45, 50,40, 50);
    }

    public override void BuildArmLeft()
    {
        g.DrawLine(p, 50, 50, 30, 100);
    }

    public override void BuildArmRight()
    {
        g.DrawLine(p, 80, 50, 100, 100);
    }

    public override void BuildLegLeft()
    {
        g.DrawLine(p, 60, 100, 45, 150);
    }

    public override void BuildLegRight()
    {
        g.DrawLine(p, 70, 100, 85, 150);
    }
}
           
class PersonDirector
{
    private PersonBuilder pb;
    public PersonDirector(PersonBuilder pb)
    {
        this.pb = pb;
    }

    public void CreatePerson()
    {
        pb.BuildHead();
        pb.BuildBody();
        pb.BuildArmLeft();
        pb.BuildArmRight();
        pb.BuildLegLeft();
        pb.BuildLegRight();
    }
}
           

用戶端實作:

Pen p = new Pen(Color.Yellow);
     PersonThinBuilder ptb = new PersonThinBuilder(pictureBox1.CreateGraphics(), p);
     PersonDirector pdThin = new PersonDirector(ptb);
     pdThin.CreatePerson();

     PersonFatBuilder pfb = new PersonFatBuilder(pictureBox2.CreateGraphics(), p);
     PersonDirector pdFat = new PersonDirector(pfb);
     pdFat.CreatePerson();
           

說明:

将一個複雜對象的構造與它的表示分離,使同樣的建構過程可以建立不同的表示,這樣的設計模式被稱為建造者模式。

它主要是用于建立一些複雜的對象,這些對象内部建構間的建造順序是穩定的,但是對象内部的建構通常面臨着複雜的變化。

比如說,胖小人(ConcreteBuilder)和瘦小人(ConcreteBuilder)的内部建構(建頭部,建身體...)都是一樣的,即使後面再多一個高小人,矮小人等,建造順序及過程都是穩定不變的,就可以建立一個建造者(Director)來完成這項工作,而每個小人的具體的頭部,身體等的建立細節不一樣,胖小人身體大一些,高小人的腳長一些,也就是,對象的内部建構存在差異。是以,我們把小人的組裝交給建造者,而小人的部件建構交給小人自己來完成。

何時使用:

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

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

在這樣的設計模式中,有以下幾個角色:

builder:

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

ConcreteBuilder:

實作Builder的接口以構造和裝配該産品的各個部件,定義并明确它所建立的表示,并 提供一個檢索産品的接口。

Director:

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

Product:

表示被構造的複雜對象。ConcreteBuilder建立該産品的内部表示并定義它的裝配過程,包含定義組成部件的類,包括将這些部件裝配成最終産品的接口。

參考資料

-《大話設計模式》

繼續閱讀