5. 生成器模式
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
《设计模式:可复用面向对象软件的基础》
如果说之前提及的工程模式、抽象工厂模式和单件模式都是在创建对象的话,那么生成器模式就是一个“精工细作”的工匠,因为它用于创建复杂对象,从独立创建对象的每个部分到最后的组装,它承担每个步骤的工作。
由于它把创建每个部分都独立为一个单一的过程,因此不仅可以完成较为“精细”的创建,还可以编排创建步骤,生产不同的目标实例。
经典模式
生成器模式解决的问题是产品局部加工过程变化较大,但组装过程相对固定。例如:
- 组装PC机,虽然声卡、显卡、内存、硬盘、机箱、CPU等有很多不同,每个部分的制造和生产过程都不同。但无论是品牌机还是个人攒机,组装一台计算机的过程相对固定。
- 汽车的生产与此类似,虽然不同品牌、不同档次的汽车在轮胎、发动机、车身的制作工艺上有很大区别,但组装的过程相对而言非常稳定。
— 类图在此 —
public class Car
{
public Car()
{
StepSequence = new List<string>();
}
public Wheel Wheel { get; set; }
public Engine Engine { get; set; }
public Body Body { get; set; }
public IList<string> StepSequence { get; private set; }
}
public interface IBuilder
{
void BuildBody();
void BuildEngine();
void BuildWheel();
}
public abstract class BuilderBase : IBuilder
{
protected Car _Car;
public BuilderBase()
{
_Car = new Car();
}
public Car GetProduct()
{
return _Car;
}
public virtual void BuildBody()
{
_Car.StepSequence.Add("Body");
}
public virtual void BuildEngine()
{
_Car.StepSequence.Add("Engine");
}
public virtual void BuildWheel()
{
_Car.StepSequence.Add("Wheel");
}
}
public class CarBuilder : BuilderBase
{
public override void BuildBody()
{
base.BuildBody();
_Car.Body = new Body();
}
public override void BuildEngine()
{
base.BuildEngine();
_Car.Engine = new Engine();
}
public override void BuildWheel()
{
base.BuildWheel();
_Car.Wheel = new Wheel();
}
}
public class AdvanceCarBuilder : BuilderBase
{
public override void BuildBody()
{
base.BuildBody();
_Car.Body = new AdvancedBody();
}
public override void BuildEngine()
{
base.BuildEngine();
_Car.Engine = new AdvancedEngine();
}
public override void BuildWheel()
{
base.BuildWheel();
_Car.Wheel = new AdvancedWheel();
}
}
public class SUVBuilder : BuilderBase
{
public override void BuildBody()
{
base.BuildBody();
_Car.Body = new SUVBody();
}
public override void BuildE