简介
建造者模式又叫生成器模式,它可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。
书中实例
小菜和大鸟在楼下吃饭,大鸟点的炒饭没放盐,难得大鸟也难受了一回。两人便感慨,好比程序设计需要实现一个小人,如果忘记写胳膊或腿儿的代码,其结果岂不是比炒饭更严重?说到这儿,大鸟又能给小菜上一课了。假设要求用程序画一个小人,小人只有头,身体,双手,双脚就可以了。到底怎么可以避免炒菜忘记放盐的发生呢?
建造者模式出现了......
建造者模式实现程序
//建造人的类
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 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();
}
}
//图片框的单击事件
private void pictureBox1_Click(object sender, EventArgs e)
{
Pen p = new Pen(Color.Red);
PersonThinBuilder pfb = new PersonThinBuilder(pictureBox1.CreateGraphics(), p);
PersonDirector pdThin = new PersonDirector(pfb);
pdThin.CreatePerson();
Console.Read();
}
![](https://i-blog.csdnimg.cn/blog_migrate/7f6408b70860b32e6cbf2650b5fa4068.png)
组成类图
关系介绍
抽象接口(Builder)类就是建造者类,具体建造者类(ConcreteBuilder)实现建造者类的接口,继承于建造者类。具体产品类(Product)与具体建造者类之间是依赖关系。指挥者类(Director)与建造者类之间是聚合关系,某种程度上说,建造者类拥有指挥者类。
建造者模式的构成
Builder(建造者类):是为创建一个Product对象的各个部分指定的抽象接口。
ConcreteBuilder(具体建造者类):实现Builder接口,构造和装配各个部件。
Product(具体产品类):就是那些具体的产品角色。
Director(指挥者类):它是构件一个使用Builder接口的对象。
建造者模式的优点
1.使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
使用场景
1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2 当构造过程必须允许被构造的对象有不同表示时。