设计模式基于C#的实现与扩展——创建型模式(五)

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值