目标:将一个复杂对象的构建与表示分离,使同样的构建过程可以创建不同的表示。
使用场景:典型的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(); } } }