目标:将一个复杂对象的构建与表示分离,使同样的构建过程可以创建不同的表示。
使用场景:典型的KFC儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。
优点:
- 使用建造者模式可以使客户端不必知道产品内部组成的细节。
- 具体的建造者类之间是相互独立的,对系统的扩展非常有利。
- 由于具体的建造过程的独立的,因此可以对建造过程逐步细化,而不对其他模块产生影响。
实现:
- Builder:抽象建造者。他声明为创建一个Product对象的各个部件指定的抽象接口。
- ConcreateBuilder:具体建造者。实现抽象接口,构建和装配各个部件。
- Director:指挥者。构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
-
Product:产品角色。一个具体的产品对象。
public class BuilderTest
{
/***
* 抽象的建造者只关心对象有哪些步骤,
* 具体的建造者只关心如何实现每一个具体的步骤,
* 指挥者只关心构建的顺序,
* 三方各司其职,很好的隔离了构建对象的步骤和顺序,
* 一但指挥者和建造者确定了,开发者只需要关心如何实现和更新具体步骤就行了,
*/
public static void Test()
{
Builder builder1 = new ConcreteBuilder();
Director director = new Director(builder1);
director.Consttruct();
var product = builder1.GetResult();
product.Show();
}
/// <summary>
/// 抽象的建造者,定义了建造者的执行步骤
/// </summary>
public abstract class Builder
{
/// <summary>
/// 构建的步骤
/// </summary>
public abstract void BuidPart1();
public abstract void BuidPart2();
public abstract void BuidPart3();
/// <summary>
/// 构建完成后的
/// </summary>
/// <returns></returns>
public abstract Product GetResult();
}
/// <summary>
/// 具体的建造者
/// </summary>
public class ConcreteBuilder : Builder
{
Product product;
public ConcreteBuilder()
{
product = new Product();
}
/// <summary>
/// 具体实现构建产品的步骤
/// </summary>
public override void BuidPart1()
{
product.AddPart("步骤1");
}
public override void BuidPart2()
{
product.AddPart("步骤2");
}
public override void BuidPart3()
{
product.AddPart("步骤3");
}
/// <summary>
/// 返回构建完成的产品
/// </summary>
/// <returns></returns>
public override Product GetResult()
{
return product;
}
}
/// <summary>
/// 产品
/// </summary>
public class Product
{
public List<string> parts;
public Product()
{
this.parts = new List<string>();
}
/// <summary>
/// 安装零件
/// </summary>
/// <param name="part"></param>
public void AddPart(string part)
{
this.parts.Add(part);
}
/// <summary>
/// 展示产品
/// </summary>
public void Show()
{
this.parts.ForEach(p => Console.WriteLine(p));
}
}
/// <summary>
/// 指挥者 指挥某个建造者按照一定的顺序组装产品
/// </summary>
public class Director
{
Builder builder;
/// <summary>
/// 和 builder是 聚合关系,builder是观察者的一个组成部分
/// </summary>
/// <param name="builder"></param>
public Director(Builder builder)
{
this.builder = builder;
}
/// <summary>
/// 指挥者开始建造
/// </summary>
public void Consttruct()
{
//定义建造者的建造顺序
builder.BuidPart1();
builder.BuidPart3();
builder.BuidPart2();
}
}
}