今天给大家介绍的是创建型模式中的最后一种-建造者模式!
我们都知道,建造一辆汽车是非常复杂的一个工作,需要建造发动机,建造轮胎,建造方向盘,建造地盘等等。但对于我们客户来说,并不需要知道这些具体的建造过程,我们只需要一辆完整的车然后使用就可以了。建造者模式和这个例子非常相似,我们相当于客户端,而那些负责建造汽车的相当于建造者,客户端和建造者之间通常有一个指挥者来协调工作。这段话大家可能不理解,没关系继续往下看。
建造者模式关注的是如何一步步创建一个复杂对象交给客户端使用,这种模式隔离了对象的创建和使用。
下面是建造者模式官方的定义:将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式主要包含以下四种角色
1.AbstractBuilder(抽象建造者):它是所有具体建造者的父类,可以设计成抽象类,接口。声明两类方法:一是创建复杂对象各个细节的方法(类图中的BuildX),二是返回复杂对象的方法(类图中的GetCar)。
2.ConcreteBuilder(BaoMaBuilder,具体建造者):它实现了抽象建造者中的声明的抽象方法或者接口。
3.Product(Car,产品):他是客户端最终想使用的那个复杂对象,也是建造者要建造的复杂对象
4.Director(指挥者):负责安排复杂对象的建造顺序。客户端一般情况下只需要于指挥者打交道就可以了。
下面是建造者模式的类图
接下来我们来看看具体的实现代码:
首先是我们要创建的复杂对象Car
namespace 建造者模式
{
public class Car//这是我们要创建的对象(产品)
{
private string fangxiangpan;//方向盘
public string Fangxiangpan
{
get { return fangxiangpan; }
set { fangxiangpan = value; }
}
private string luntai;//轮胎
public string Luntai
{
get { return luntai; }
set { luntai = value; }
}
private string fadongji;//发动机
public string Fadongji
{
get { return fadongji; }
set { fadongji = value; }
}
//...汽车的其他部位省略不写了.....
}
}
然后是抽象建造者AbstractBuilder,这里我们设计成抽象类。
namespace 建造者模式
{
public abstract class Builder//这是我们的抽象建造者
{
public Car c = new Car();
public abstract void BuildFXP();//建造方向盘
public abstract void BuildLT();//建造轮胎
public abstract void BuildFDJ();//建造发动机
public Car GetCar()//建造汽车
{
Console.WriteLine("我拿到宝马汽车啦");
return c;
}
}
}
接下来是我们的具体建造者BaoMaBuilder
namespace 建造者模式
{
//具体建造者,继承了抽象类Builder,这里我写成宝马建造者,就是建造宝马汽车喽
public class BaoMaBuilder:Builder
{
public override void BuildFXP()
{
c.Fangxiangpan = "宝马方向盘";
Console.WriteLine("宝马汽车方向盘建造完毕!");
}
public override void BuildLT()
{
c.Luntai = "宝马轮胎";
Console.WriteLine("宝马汽车轮胎建造完毕!");
}
public override void BuildFDJ()
{
c.Fadongji = "宝马发动机";
Console.WriteLine("宝马汽车发动机建造完毕!");
}
}
}
然后是我们的指挥者类Director
namespace 建造者模式
{
public class Director
{
private Builder builder;
public Director(Builder b)
{
builder = b;
}
public void SetBuilder(Builder b)
{
this.builder = b;
}
public Car CreateCar()//客户端通过这个方法拿到复杂对象
{
builder.BuildFDJ();
builder.BuildFXP();
builder.BuildLT();
return builder.GetCar();
}
}
}
最后是我们的客户端类,为了方便这里我就不通过配置文件和反射的方式来加载具体的建造者类了
namespace 建造者模式
{
class Program
{
static void Main(string[] args)
{
Director d = new Director(new BaoMaBuilder());
d.CreateCar();
Console.ReadLine();
}
}
}
来看看运行结果吧
从图中可以看出来,指挥者类可以决定复杂对象各个部件的创建先后顺序也可以做一些额外的处理工作,最后返回一个复杂对象。客户端通过这个方法就可以拿到它想要的复杂对象了。
接下来的文章将会给大家开始介绍结构型模式中的第一种——适配器模式,敬请期待。