1、概念
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2、角色
产品(Product)——根据不同建造者建造的结果;
抽象建造者(Builder)——包含详细的建造步骤;
指挥者(Director)——安排如何建造,如何安排步骤的先后顺序;
具体的建造者——根据不同的需求,实现Builder的步骤,每一步骤如何实现是不同的,但是Builder中的所有步骤必须都要有。
3、模型
各角色的实现
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace BuilderPattern
- {
- public class Product//产品
- {
- List<string> parts = new List<string>();
- public void Add(string part)
- {
- parts.Add(part);
- }
- public void ShowProductStep()
- {
- Console.WriteLine(@"开始创建产品:");
- foreach (string part in parts)
- {
- Console.WriteLine(part);
- }
- }
- }
- public abstract class Builder//抽象建造者
- {
- public abstract void BuilderStep1();
- public abstract void BuilderStep2();
- public abstract void BuilderStep3();
- // ... 根据不同的需求,该产品生产时所需的所有步骤。
- public abstract Product GetProduct();
- }
- public class ProductBuilder1 : Builder//具体建造者1
- {
- private Product product = new Product();
- public override void BuilderStep1()
- {
- product.Add("第一步 -- ");
- }
- public override void BuilderStep2()
- {
- product.Add("第二步 -- ");
- }
- public override void BuilderStep3()
- {
- product.Add("第三步");
- }
- public override Product GetProduct()
- {
- return product;
- }
- }
- public class ProductBuilder2 : Builder//具体建造者2,具体建造者的具体步骤是不同的,但是有哪些步骤,这是统一的。
- {
- private Product product = new Product();
- public override void BuilderStep1()
- {
- product.Add("第1步 -- ");
- }
- public override void BuilderStep2()
- {
- product.Add("第2步 -- ");
- }
- public override void BuilderStep3()
- {
- product.Add("第3步");
- }
- public override Product GetProduct()
- {
- return product;
- }
- }
- public class Derector//指挥者
- {
- public void Construct(Builder builder)
- {
- builder.BuilderStep1();
- builder.BuilderStep2();
- builder.BuilderStep3();
- }
- }
- }
客户端调用
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace BuilderPattern
- {
- class Program
- {
- static void Main(string[] args)
- {
- Derector derector = new Derector();
- Builder builder1 = new ProductBuilder1();
- Builder builder2 = new ProductBuilder2();
- //建造产品1
- derector.Construct(builder1);
- Product product1 = builder1.GetProduct();
- product1.ShowProductStep();
- //建造产品2
- derector.Construct(builder2);
- Product product2 = builder2.GetProduct();
- product2.ShowProductStep();
- Console.ReadKey();
- }
- }
- }
结果
建造者模式强调的是步骤,就是得到的结果必须保证产生这个结果的流程都是统一的,而且也是的算法和表示分离,这一点类似于策略模式,不同的算法来实现这个策略。但是建造者模式更强调的是步骤。同时从指挥者这部分看又有些类似于外观模式,定义一个高层接口使子系统更加容易使用。但是建造者模式中,这部分的特点是指挥者决定步骤的顺序,它指挥如何建造,而且经过它指挥的产生的结果在流程上是一样的。