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();
}
}
}
结果
建造者模式强调的是步骤,就是得到的结果必须保证产生这个结果的流程都是统一的,而且也是的算法和表示分离,这一点类似于策略模式,不同的算法来实现这个策略。但是建造者模式更强调的是步骤。同时从指挥者这部分看又有些类似于外观模式,定义一个高层接口使子系统更加容易使用。但是建造者模式中,这部分的特点是指挥者决定步骤的顺序,它指挥如何建造,而且经过它指挥的产生的结果在流程上是一样的。