(二),Builder模式
最后更新于:2022-04-01 09:56:59
### 前言
Builder(构造者)模式也是一种常用的设计模式,它是用来一步一步构建复杂事物而设计的模式,使用这种模式可以使得**复杂事物的构建与展示相分离**,具有降低耦合,向外部隐藏复杂事物的构建过程等优点。
Builder模式的使用场景:
(1)相同的方法,不同的执行顺序,产生不同的结果;
(2)多个部件或零件,属性都可以装配到一个对象中,但是产生的运行又不相同;
(3)产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用,这个时候用Builder模式非常合适;
(4)当初始化一个对象特别复杂,如:参数属性多,且很多参数都有默认值。
### Builder模式的实现
以生产汽车为例展示Builder模式的过程。我们知道汽车有很多零件,什么方向盘,发动机,轮子等等,同时它还有一个属性,如:名称,价格,级别等。这些都要汽车生产商来完成,那么汽车生产商就是Builder。汽车生产好了以后要投入市场出售,这时汽车会在汽车商城展示。
1、汽车 –>要构建的复杂的事物
~~~
public class Car {
private String name; // 名称:宝马,奔驰,奥迪...
private String price; // 价格,3万,10万...
private String grade; // 级别,小型车,中型车,大型车
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + ", grade=" + grade
+ "]";
}
}
~~~
这里只为了展示Builder模式,所以不涉及零件或者属性等具体的实现。
2、汽车生产商–>CarBuilder.java
~~~
public class CarBuilder {
private String name;
private String price;
private String grade;
/**
* 构造名称
*/
public CarBuilder buildName(String name){
this.name = name;
return this;
}
/**
* 构造价格
*/
public CarBuilder buildPrice(String price){
this.price = price;
return this;
}
/**
* 构造级别
*/
public CarBuilder buildGrade(String grade){
this.grade = grade;
return this;
}
/**
* 生产汽车
*/
public Car create(){
Car car= new Car();
car.setName(name);
car.setPrice(price);
car.setGrade(grade);
return car;
}
}
~~~
通常来说,Builder的setter会返回自身this,这样可以实现链表式操作,这里的CarBuilder代表汽车生产商,模拟汽车的生产过程。
3、汽车商城(展示汽车)–>CarShow.java
~~~
public class CarShow {
private CarBuilder builder;
public CarShow(CarBuilder builder){
this.builder = builder;
}
public Car getCar(){
return builder.create();
}
}
~~~
这一步有时候也往往会省略,即只有Builder,这只实现汽车的一个展示的过程,客户也可以直接去汽车生产商那买汽车,不用去汽车商城买汽车。
4、客户挑选汽车–>Test.java
~~~
public class Test {
public static void main(String[] args) {
CarBuilder builder = new CarBuilder();
builder.buildName("宝马");
builder.buildPrice("100万");
builder.buildGrade("小型车");
Car car = builder.create();
System.out.println(new CarShow(builder).getCar());
}
}
~~~
结果:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-17_56ea5b36b8610.jpg "")
即:客户实际看到的汽车是100万的小型车宝马
总结:上面的这些就是Builder的过程,通常就是两步,即:构建和展示。有时候会省略展示的过程,直接由构建者Builder完成构建和展示。上面的例子不是为了初始化一个Car对象而是为了通过这种模式模拟实现汽车的构造和展示相分离。如果我们将Builder设置成一个接口或者抽象类,那么传入不同的Buidler就可以得到不同的汽车,这样一来这种模式的灵活性和可扩展性就大大提高了,而且耦合性非常低。