C#建造者模式
一、引言
它主要用于创建一些复杂对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
它使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
二、目的
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
三、特点
优点:
表述与构建分离。
方便扩展。
接口交互,建造者后期添加或减少不对用户调用产生较大影响。
缺点:
建造者没有等级的划分,结构不清晰。
建造者内部的任务固定,顺序不易颠倒,否则造成很大的影响
四、建造者范例
如上图所示,
1、Director作统一调度和指挥,Director俗称包“包工头”;
2、Builder是建筑的统一规范,它是抽象类。每个建筑者必须继承此类,以符合相关建筑规范。
3、ConcreteBuilder是具体的建筑队,它继承Builder,实现内部规范。
4、Product是产品,它是建筑队索要建造的对象。
包工头,其职责在于指挥和控制建筑队
//指导员(包工头),负责总指挥
class Director
{
//组建建筑队,不建议在这里做,如果这样做了,如果用户想要改变建筑队,就需要修改Director类。耦合性高
//public Director()
//{
// Builder b1 = new ConcreteBuilder1(); //新建一个建筑队1
// Builder b2 = new ConcreteBuilder2(); //新建一个建筑队2
//}
//指挥一个"建筑队"做具体的事情。
public void Construct(Builder builder) //在包工头职责里含有指导指定建筑队进行相关作业
{
builder.BuildPartA(); //指挥建造A
builder.BuildPartB(); //指挥建造B
}
}
//按照情况来说,包公头本应该还有一个职责就是召集若干个建筑队,但是这里不建议
//建造者规范(此为接口,Director与实际建造者沟通就是此接口)
//统一的接口,建筑队必须能造建筑部分A,能早建筑部分B,还可以反馈建造进度
abstract class Builder
{
public abstract void BuildPartA(); //建造A
public abstract void BuildPartB(); //建造B
public abstract Product GetResult();
}
//第一建筑队,符合建筑规范的接口
class ConcreteBuilder1 : Builder
{
private Product product = new Product();