.Net设计模式_建造者模式

引言:

建造者的特点是过程,需要建造对象的过程是一样的,如:软件项目,过程都是,POC、投标、立项、软件过程、收款,那么标准的软件项目都是这个过程,只是不同的项目在做这个过程的内容不一样。所以需要有一个过程,这个过程需要被抽象出来(接口化),不同的项目实现不同的过程。

上面的过程,是有顺序的,POC、投标、立项、软件过程、收款,这个过程不能乱,所以需要有一个指挥官来固定建造的顺序。

结合上述两点,就是一个建造的的模式了,理论的说法是:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

理解:

建造者模式通常包括下面几个角色:

1. builder:给出一个抽象接口,以规范产品对象的各个组成部分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。

2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。

3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

4. Product:要创建的复杂对象。

UML图:(出之C#设计模式(8)-Builder Pattern - 吕震宇 - 博客园

代码示例:

// 创建车的过程
public interface IBuilder
{
    void BuildPartA();
    void BuildPartB();
    Car GetCar();
}
// A车
public class ConcreteBuilderA : IBuilder
{
    Car car = new Car();
    public void BuildPartA()
    {
        car.Add("Build A Car part1");
    }

    public void BuildPartB()
    {
        car.Add("Build A Car part2");
    }

    public Car GetCar()
    {
        return car;
    }
}
// B车
public class ConcreteBuilderB : IBuilder
{
    Car car = new Car();
    public void BuildPartA()
    {
        car.Add("Build B Car part1");
    }

    public void BuildPartB()
    {
        car.Add("Build B Car part1");
    }

    public Car GetCar()
    {
        return car;
    }
}

// 车对象
public class Car
{
    ArrayList parts = new ArrayList();

    public void Add(string part)
    {
        parts.Add(part);
    }

    public void Show()
    {
        Console.WriteLine(" Car Parts -------");
        foreach (string part in parts)
            Console.WriteLine(part);
    }
}

// 指挥者
public class Director
{
    public void BuilderCar(IBuilder builder)
    {
        builder.BuildPartA();
        builder.BuildPartB();
    }
}

static void Main(string[] args)
{
    // 指挥者
    Director director = new Director();
    // 建造对象1
    IBuilder b1 = new ConcreteBuilderA();
    // 建造对象2
    IBuilder b2 = new ConcreteBuilderB();
    // 执行对象1
    director.BuilderCar(b1);
    Car c1 = b1.GetCar();
    c1.Show();
    // 执行对象2
    director.BuilderCar(b2);
    Car c2 = b2.GetCar();
    c2.Show();

    Console.ReadKey();
}

从代码我们可以进一步的确认,需要建造的对象有不同的部分,如:partA、partB、....,建造这些部分的顺序是固定的A、B、....。

我们需要抽象出建造这些部分的接口,从而实现建造一样有A、B、....部分的不同商品。

总结:

1.使用建造者模式可以使客户端不必知道产品内部组成的细节。

2.具体的建造者类之间是相互独立的,对系统的扩展非常有利。

3.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

使用的场景:

1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。

2.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值