一.引入
大鸟与小菜吃到的炒面味道不同,而类似肯德基的快餐则不会出现这样情况。其中的原因就是他们的工作流程是非常规范的,时间、温度、热度都确定。这里的工作流程就是一种抽象的流程,此话我们如何去理解呢?
二.解决过程
① 建造小人一
Graphics gThin = pictureBox1.CreateGraphics();
gThin.DrawEllipse(p, 50, 20, 30, 30);
gThin.DrawRectangle(p, 60, 50, 10, 50);
gThin.DrawLine(p, 60, 50, 40, 100);
gThin.DrawLine(p, 70, 50, 90, 100);
gThin.DrawLine(p, 60, 100, 45, 150);
gThin.DrawLine(p, 70, 100, 85, 150);
这样,每次建造一个小人都需要写画头、身体、两手和两脚,很麻烦,也很容易出错。所以,还是需要创建类。
② 建造小人二
创建瘦人类:
class PersonFatBuilder
{
private Graphics g;
private Pen p;
public PersonFatBuilder(Graphics g, Pen p)
{
this.g = g;
this.p = p;
}
public void Build()
{
g.DrawEllipse(p, 50, 20, 30, 30);
g.DrawRectangle(p, 45, 50, 40, 50);
g.DrawLine(p, 50, 50, 30, 100);
g.DrawLine(p, 80, 50, 100, 100);
g.DrawLine(p, 60, 100, 45, 150);
g.DrawLine(p, 70, 100, 85, 150);
}
}
这样,确实解决了复用代码建造小人,但是炒面没放盐的问题还是没有解决。在编程的过程中,还是可能丢失小人的某一个部分。所以,就要应用建造者模式。
③ 建造者模式建造小人
定义抽象的建造人的类:
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();
}
}
这样,指挥者根据用户选择一步步建造小人,并且不会遗忘小人的各个部位。
三.应用模式
建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
好处:使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以。
四.学习心得
其实, 想想生活实际中,处处都是建造者模式。其本质就是产品与构件相分离。每个构件都是产品中必不可少的。所以说,为了避免构件的丢失,就将产品中需要用到的那些构件组合在一起。比如:电脑产品,其中,输入设备、输出设备和主机三个部件不可少,有了它们,就有不同的电脑产品。将书上的定义用生活的角度来看,其实就很容易理解了。