zoukankan      html  css  js  c++  java
  • .Net设计模式_建造者模式

    引言:

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

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

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

    理解:

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

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

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

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

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

    UML图:(出之http://www.cnblogs.com/zhenyulu/articles/37378.html

    代码示例:

    // 创建车的过程
    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.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。

    代码下载:

    百度网盘 http://pan.baidu.com/s/1gdHsIdX

    CSDN http://download.csdn.net/detail/hater22/6842403

  • 相关阅读:
    Java中四个作用域的可见范围
    java构造方法前加void有什么作用
    css3渐变
    日历插件
    三级联动地点
    js返回上一级代码和刷新页面代码
    css3滚动条
    如何写评价“星星”有半个情况的,如3.5,这样写好调数据
    原生态js单个点击展开收缩和jQuery的写法
    推荐大家使用的CSS书写规范、顺序
  • 原文地址:https://www.cnblogs.com/kimi-gyj/p/3513970.html
Copyright © 2011-2022 走看看