概述
其核心思想是将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构件算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。因此,如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到他们,而具体的建造过程的细节就不需知道了。
优点
使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要在定义一个具体的建造者就可以了。
结构图
示例
挖个坑,埋点土,数个一二三四五。这是小品中朗朗上口的种树过程。今天我们以它为例来谈谈建造模式。有了种树过程,就不会遗忘任何一步。但是我们具体种的树不一样,可能挖的坑大小或 埋的土多少都是不一样的。 下面以种 杨树 松树为例来看看实现过程。
namespace ConsoleApplication8
{
class Program
{
/*抽象种树类 确定种树需要的几个环节 来把过程稳住 不遗忘任何一步 有了它我们就知道种树的都需要干什么了*/
abstract class Plant
{
public abstract void 挖坑();
public abstract void 埋土();
public abstract void 数数();
}
/*具体种树类,杨树。让这个杨树类继承抽象类。那就必须去重写这些抽象方法,否则编译器不让通过。这样种杨树和上文种树的过程是一样的,这里杨树具体实现*/
class PlanPoplar:Plant
{
private string name;
public PlanPoplar(string name)
{
this.name = name;
}
public override void 挖坑()
{
Console.WriteLine("挖个大坑");
}
public override void 埋土()
{
Console.WriteLine("埋好多土");
}
public override void 数数()
{
Console.WriteLine("慢慢地数");
}
}
/*具体种树类。种松树的过程同上*/
class PlantPine : Plant
{
private string name;
public PlantPine(string name)
{
this.name = name;
}
public override void 挖坑()
{
Console.WriteLine("挖个小坑");
}
public override void 埋土()
{
Console.WriteLine("埋一点土");
}
public override void 数数()
{
Console.WriteLine("快速地数");
}
}
/*一个指挥者,用它来控制种树过程,控制种什么树 先执行哪一步等。也用它来隔离用户与植树过程的关联*/
class PlantDirector
{
private Plant p;
public PlantDirector(Plant p)//用户告诉指挥者,我需要种什么树
{
this.p =p;
}
public void PlantTree()//根据用户的选择种树
{
p.挖坑();
p.埋土();
p.数数();
}
}
/*客户端 指明要种什么树即可*/
static void Main(string[] args)
{
PlanPoplar p1 = new PlanPoplar("杨树");
PlantDirector director = new PlantDirector(p1);
director.PlantTree();
Console.WriteLine(" ");
}
}
}
总结
建造者模式主要由 抽象类(写明各个过程或部件),具体实现类(继承抽象类,重写抽象方法),指挥者(控制建造过程)组成。它是当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。