版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37080285/article/details/86494352
在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成。例如如果需要一辆车,在这个实际需求中,车就是一个复杂的对象,它是由轮胎,发动机,车身等组装而成的,如果让我们买一个个零件去组装成一个车的话就很不实际,肯定是车厂干这事嘛对吧,于是这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个车厂的建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了。
那我们新建一个车的类。
public class Car
{
public string Wheel { get; set; }
public string Engine { get; set; }
public string Body { get; set; }
}
然后创建一个建造者类,虽然有各种不同的车厂:奥迪、奔驰等,甚至有不同的车型:卡车、SUV等,虽然造出来的样子可能不是一样的,但是他们的操作都是一样的,造轮胎,发动机等等,这些都是不同的建造者类,因此我定义为抽象类,用接口也可以。
public abstract class MyBuilder
{
protected Car car;
public abstract void BuildWheel();
public abstract void BuildEngine();
public abstract void BuildBody();
public Car CreateCar()
{
return car;
}
}
public class SUVBuilder : MyBuilder
{
public SUVBuilder()
{
car = new Car();
}
public override void BuildBody()
{
car.Body = "SUV";
}
public override void BuildEngine()
{
car.Engine = "发动机";
}
public override void BuildWheel()
{
car.Wheel = "四个轮";
}
}
接下来,就是介绍建造者模式的精髓,那就是Director。这个Director呢,就是来执行我们刚才的造车动作的。
public class Director
{
public Car CreateCarByBuilder(MyBuilder builder)
{
builder.BuildBody();
builder.BuildEngine();
builder.BuildWheel();
return builder.CreateCar();
}
}
这个director类呢,重点在于CreateCarByBuilder的参数是我们的造车标准的接口。这样一来,只要是实现了我们的这个接口的类,就都可以作为参数,我们刚刚不是造了一个SUV吗?那我们如果想造一个卡车,这个Director也可以启动这个造车过程,只要我们把这个卡车的类先写好。
Director director = new Director();
Car car = director.CreateCarByBuilder(new SUVBuilder());
Console.WriteLine(car.Body);
Console.WriteLine(car.Engine);
Console.WriteLine(car.Wheel);
输出结果:
SUV
发动机
四个轮
总结
到这里,建造者模式的介绍就结束了,建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。建造者模式的本质是使组装过程(用指挥者类进行封装,从而达到解耦的目的)和创建具体产品解耦,使我们不用去关心每个组件是如何组装的。