引言:html
建造者的特色是过程,须要建造对象的过程是同样的,如:软件项目,过程都是,POC、投标、立项、软件过程、收款,那么标准的软件项目都是这个过程,只是不一样的项目在作这个过程的内容不同。因此须要有一个过程,这个过程须要被抽象出来(接口化),不一样的项目实现不一样的过程。算法
上面的过程,是有顺序的,POC、投标、立项、软件过程、收款,这个过程不能乱,因此须要有一个指挥官来固定建造的顺序。ui
结合上述两点,就是一个建造的的模式了,理论的说法是:是将一个复杂的对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示。spa
理解:.net
建造者模式一般包括下面几个角色:code
1. builder:给出一个抽象接口,以规范产品对象的各个组成部分的建造。这个接口规定要实现复杂对象的哪些部分的建立,并不涉及具体的对象部件的建立。htm
2. ConcreteBuilder:实现Builder接口,针对不一样的商业逻辑,具体化复杂对象的各部分的建立。 在建造过程完成后,提供产品的实例。对象
3. Director:调用具体建造者来建立复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整建立或按某种顺序建立。blog
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.要建立的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。
代码下载: