When use?
如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,即需要建造者模式,又叫生成器模式。
如果我们用了建造者模式,那么用户就只需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道。
B:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
创建游戏中一个人物的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 BuildLeftArm();
public abstract void BuildRightArm();
public abstract void BuildLeftLeg();
public abstract void BuildRightLeg();
}
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, 60, 50, 10, 50);
}
public override void BuildLeftArm()
{
g.DrawLine(p, 60, 50, 40, 100);
}
public override void BuildRightArm()
{
g.DrawLine(p, 70, 50, 90, 100);
}
public override void BuildLeftLeg()
{
g.DrawLine(p, 60, 100, 45, 150);
}
public override void BuildRightLeg()
{
g.DrawLine(p, 70, 100, 85, 150);
}
}
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 BuildLeftArm()
{
g.DrawLine(p, 60, 50, 40, 100);
}
public override void BuildRightArm()
{
g.DrawLine(p, 70, 50, 90, 100);
}
public override void BuildLeftLeg()
{
g.DrawLine(p, 60, 100, 45, 150);
}
public override void BuildRightLeg()
{
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.BuildLeftArm();
pb.BuildRightArm();
pb.BuildLeftLeg();
pb.BuildRightLeg();
}
}
客户端代码:
Pen p = new Pen(Color.Yellow);
PersonThinBuilder ptb = new PersonThinBuilder(pictureBox1.CreateGraphics(), p);
PersonDirector pd = new PersonDirector(ptb);
pd.CreatePerson();
PersonFatBuilder pfb = new PersonFatBuilder(pictureBox1.CreateGraphics(), p);
PersonDirector pd1 = new PersonDirector(pfb);
pd1.CreatePerson();
总结:建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。