什么是建造者模式呢?其实就是说将一个对象的创建过程与这个对象的表示分离开来,用同样的过程,可以创建不同的显示。
我们先看看建造者模式的结构图:
在这个结构图中包括一个指导者(Director),一个抽象建造者(Builder),一个负责具体产品的建造者(ConcreteBuilder),产品(Product)
Builder:为了创建Product这个产品,抽象建造者需要规范整个产品的建造流程,比如先建造哪部分,再建造哪部分,或者提供一个模型(Product),让具体的建造者完成模型的组装过程。
ConcreteBuilder:具体建造者,这个类继承Builder接口,并且遵循Builder接口规范的,按照Builder规定的顺序创建产品Product
Product:在建造时已经知道了产品的详细信息,目前要做的就是要把产品交给谁创建的问题。
Director:指定需要调用哪个建造者Builder并且按照规定的建造流程指导完成建造过程。
代码如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace Design_Patterns.Builder
{
public class Director
{
public void Construct()
{
builder.BuildPartA();
builder.BuildPartB();
}
}
public abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GenerateProduct();
}
public class ConcreteBuilderA:Builder
{
public override void BuildPartA()
{
product.Add("ConcreteBuilderA BuildPartA");
}
public override void BuildPartB()
{
product.Add("ConcreteBuilderB BuildPartB");
}
public override Product GenerateProduct()
{
return product;
}
}
public class ConcreteBuilderB:Builder
{
public override void BuildPartA()
{
product.Add("ConcreteBuilderB BuildPartA");
}
public override void BuildPartB()
{
product.Add("ConcreteBuilderB BuildPartB");
}
public override Product GenerateProduct()
{
return product;
}
}
public class Product
{
public void ShowProduct()
{
Console.WriteLine("Out Put All Products......");
}
}
/// <summary>
/// 生成器模式
/// <remarks>
/// 意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
/// 适用性:
/// 1:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
/// 2:当构造过程必须允许被构造的对象有不同表示时。
/// </remarks>
/// </summary>
public class RunBuilder
{
public void Run()
{
Director director = new Director();
Builder builderA = new ConcreteBuilderA();
Builder builderB = new ConcreteBuilderB();
director.Construct(builderA);
Product productA = builderA.GenerateProduct();
productA.ShowProduct();
director.Construct(builderB);
Product productB = builderB.GenerateProduct();
productB.ShowProduct();
}
}
}
总觉得这个概念有点不是很好理解,最近一段时间在网上看房子,看车(只能YY一下,买不起啊),突然发现这两者都很像我们要学习的建造者模式,为什么呢?因为建造房屋其实也是一个复杂的过程,需要设计师设计的效果图,比如外部效果,内部空间效果,房屋构造等等,工程师把设计师的图纸翻译成建筑用的工程图,比如那个地方用多少水泥,混泥土要打多少,柱子的承重能力等等(我不是建筑工人,这些也是自己能想到的,估计也是必须要用到的吧)。接下来干什么呢?打地基,浇铸地基,搭建钢筋混泥土结构的框架,封顶,砌墙,安装门窗,公共设施处理,比如楼梯,电梯等等,这些工作做完后一栋楼房基本上完工了,当然了,这是毛坯房,精装修可以是建造者模式或者装饰者模式要干的事,我们就盖毛坯房吧。在房地产公司眼中,我需要的是修建好的房子,我给你提供了效果图,你按照效果图给我建造房屋就可以了。
接下来我们看看盖房子需要哪些基础设施:
材料:钢筋,水泥,沙子,石头,窗户,门,瓦.......
设备:塔吊,搅拌机,卷扬机..........
人员:工程师,建筑师,各种技能的工人............
通过上面的列表,我们发现修建房屋是一个很复杂的过程。
我们抽象建造房子过程中的各个角色
Client:请求发起者,房产公司(real estate agency),因为是房产公司要盖房屋,而且有设计效果图Product
Product:楼房(Building),
Director:建筑公司(construction company),建筑公司下辖很多施工队,对于建造不同的房屋,建筑公司可以指派不同的施工队完成
Builder:施工管理人员(建筑师:architect),用来规范先做什么后做什么,不能先安装门窗后砌墙,这个肯定行不通的。
ConcreteBuilder:施工队(ConstructionTeam),为了完成指定任务而指定的具体任务实施者
我们看看这次的结构图跟上面类似的:
偷个懒吧,代码类似的,就不写了。
使用建造者模式的场景:
1、 需要生成的产品对象有复杂的内部结构。
2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
使用建造者模式主要有以下效果:
1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其它的Builder无关。
3、 模式所建造的最终产品更易于控制。