建造者模式是我们平时开发中用的比较多的一种设计模式,特别是我们看源码的时候,感觉几乎是随处可见,那我们今天就以一个平日比较常见的例子来了解下建造者模式吧~
小明是一家汽车公司的生产者,有天老板跟小明说,有个客户要买车,要10000辆,每辆车要有车头,车身,车轮,小明觉得很简单,然后就开始生产:
public class Car {
private String head;
private String body;
private String wheel;
public Car(String head, String body, String wheel) {
this.head = head;
this.body = body;
this.wheel = wheel;
}
}
// 生产
for (int i = 1; i <= 10000; i++) {
Car car = new Car("head", "body", "wheel");
}
过两天,老板跟小明说,又有一个客户下单,要求有车头,车身,车灯,但是不要车轮,因为之前的订单还在生产,不能直接改原来的汽车设计,所以小明决定加一个方法:
public class Car {
private String head;
private String body;
private String wheel;
private String light;
public Car(String head, String body, String wheel) {
this.head = head;
this.body = body;
this.wheel = wheel;
}
public Car(String head, String body, String light) {
this.head = head;
this.body = body;
this.light = light;
}
}
//生产
for (int i = 1; i <= 10000; i++) {
Car car = new Car("head", "body", "light");
}
过两天,老板又过来跟小明说,又有一个大客户,要买好多车,但是要求出了有车头、车轮、车厢,但是不要车身,小明要听了感觉要炸了,要是天天这样改还得了,于是乎小明就开始精心设计他的车辆结构:
public class Car {
private String head;
private String body;
private String wheel;
private String light;
private String carriage;
private Car() {} //没有任何结构的车子是没有意义的,不允许生产,所以用private
public static class CarBuilder {
Car car = new Car();
public CarBuilder buildHead(String head) {
car.head = head;
return this;
}
public CarBuilder buildBody(String body) {
car.body = body;
return this;
}
public CarBuilder buildWheel(String wheel) {
car.wheel = wheel;
return this;
}
public CarBuilder buildLight(String light) {
car.light = light;
return this;
}
public CarBuilder buildCarriage(String carriage) {
car.carriage = carriage;
return this;
}
public Car build() {
return car;
}
}
}
// 生产
for (int i = 1; i <= 10000; i++) {
Car.CarBuilder builder = new Car.CarBuilder();
Car car = builder.buildHead("head")
.buildWheel("wheel")
.buildCarriage("carriage")
.build();
}
如此一来,不管啥用户要什么样结构的车辆,小明通过简单拼装就可以生产出来。
其实我们平时生活中的建造者模式很常见,比如我们吃麦当劳,产品都是生产好的,要什么套餐就把相应的产品取出拼一起就是一份套餐了。
那么建造者模式有哪些适用场景呢?1、相同的方法,不同的执行顺序,产生不同的结果。2、多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。3、产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。4、初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。