14.1生成器模式定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
14.2生成器模式UML类图:
14.3应用场景:
1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2、当构造过程必须允许被构造的对象有不同的表示时。
14.4生成器模式分析与实现(c#描述):
//抽象假期计划生成器:复杂对象(假期计划)的创建过程由以下几步组成
public abstract class VacationPlannerBuilder
{
public abstract void AddHotel();
public abstract void AddSpecialEvent();
public abstract void AddTickets();
public abstract IList<string> GetVacationPlanner();//获得当前的复杂对象:假期计划
}
//具体假期计划生成器A:实现具体的假期计划动作。
public class ConcreteVacationPlannerBuilderA : VacationPlannerBuilder
{
private IList<string> VacationPlanner = new List<string>();
public override void AddHotel()
{
this.VacationPlanner.Add("订购一间四星级酒店。");
}
public override void AddSpecialEvent()
{
this.VacationPlanner.Add("外出打篮球。");
}
public override void AddTickets()
{
this.VacationPlanner.Add("买火车票。");
}
public override IList<string> GetVacationPlanner()
{
return this.VacationPlanner;
}
}
//具体假期计划生成器B:实现具体的假期计划动作。
public class ConcreteVacationPlannerBuilderB : VacationPlannerBuilder
{
private IList<string> VacationPlanner = new List<string>();
public override void AddHotel()
{
this.VacationPlanner.Add("订购一间三星级酒店。");
}
public override void AddSpecialEvent()
{
this.VacationPlanner.Add("外出放风筝。");
}
public override void AddTickets()
{
this.VacationPlanner.Add("买飞机票。");
}
public override IList<string> GetVacationPlanner()
{
return this.VacationPlanner;
}
}
//指导类A:用来指导复杂对象生成的步骤,这里用来指导具体假期中包含哪些计划。
public class DirectorA
{
public void ConstructVocationPlanner(VacationPlannerBuilder aobj_Builder)
{
aobj_Builder.AddHotel();//A客户的假期计划为:订购旅店和参加特殊活动。
aobj_Builder.AddSpecialEvent();
IList<string> VocationPlanner = aobj_Builder.GetVacationPlanner();
}
}
//指导类B:
public class DirectorB
{
public void ConstructVocationPlanner(VacationPlannerBuilder aobj_Builder)
{
aobj_Builder.AddSpecialEvent();//B客户的假期计划为:参加特殊活动和买票。
aobj_Builder.AddTickets();
IList<string> VocationPlanner = aobj_Builder.GetVacationPlanner();
}
}
//调用类
public class Builder_Test
{
public static void Do1()//模拟A调用者
{
VacationPlannerBuilder lobj_Builder = new ConcreteVacationPlannerBuilderA();
DirectorA lobj_DirectorA = new DirectorA();
lobj_DirectorA.ConstructVocationPlanner(lobj_Builder);
lobj_Builder.GetVacationPlanner();//最终获取当前假期计划
}
public static void Do2()//模拟B调用者
{
VacationPlannerBuilder lobj_Builder = new ConcreteVacationPlannerBuilderB();//(这里仍然可以选择ConcreteVacationPlannerBuilderA,相当于虽然是同一个生成器对象,但由于是不同的指导者,但创建复杂对象的步骤却是可以定制的。)
DirectorB lobj_DirectorB = new DirectorB();
lobj_DirectorB.ConstructVocationPlanner(lobj_Builder);
lobj_Builder.GetVacationPlanner();//最终获取当前假期计划
}
生成器模式优点:
1、将一个复杂对象的创建过程封装起来。这里我们将每一个对象“可能”的创建过程封装在具体生成器实现类中。
2、允许对象通过多个步骤来创建,并且可以改变过程。这里我们可以通过Client来改变(自由搭配)对象的创建步骤,而不是像其它工厂模式一样只有一个步骤。这也就是定义中提到的同样的创建过程可以创建不同的表示。
3、向客户隐藏产品的内部实现。(这一点是所有创建型模式都有的)
4、产品的实现可以被替换,因为客户(注意这里的客户是指调用者)只看到一个抽象的接口。(所有的抽象都是用来干这个事的,呵呵)