建造者模式(Builder Pattern)是将一个复杂的对象构建的过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型模式。使用建造者模式对于用户而言只需指定需要建造的类型就可以获得对象,建造过程及细节不需要了解。
建造者模式的设计中主要有四个角色:
1、Builder(建造者抽象):为创建一个产品对象的各个部件指定抽象接口。
2、ConcreteBuilder(建造者):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3、Director(调用者):构造一个使用Builder接口的对象。
4、Product(产品):表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
类图如下:
建造者模式的应用场景
建造者模式适用于一个具有较多的零件的复杂产品的创建过程,由于需求的变化,组成这个复杂产品的各个零件经常猛烈变化,但是它们的组合方式却相对稳定。
建造者模式适用于以下几种场景:
1、相同的方法,不同的执行顺序,产生不同的结果时。
2、多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
3、产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用。
4、当初始化一个对象特别复杂,参数多,而且很多参数都具有默认值时。
建造者模式的基本写法
我们以汽车为例,汽车一般由发动机、底盘、车身和电气设备等四个基本部分组成。我们创建一个产品类Car:
然后创建建造者类 CarBuilder,将复杂的构造过程封装起来,构造步骤由用户决定:public class Car implements Serializable{
//发动机
private String engine;
//底盘
private String chassis;
//车身
private String body;
//电器设备
private String electrical;
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public String getChassis() {
return chassis;
}
public void setChassis(String chassis) {
this.chassis = chassis;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getElectrical() {
return electrical;
}
public void setElectrical(String electrical) {
this.electrical = electrical;
}
@Override
public String toString() {
return "Car{" +
"engine='" + engine + '\'' +
", chassis='" + chassis + '\'' +
", body='" + body + '\'' +
", electrical='" + electrical + '\'' +
'}';
}
}
编写测试类:public class CarBuilder {
private Car car = new Car();
public void addEngine(String engine){
car.setEngine(engine);
}
public void addChassis(String chassis){
car.setChassis(chassis);
}
public void addBody(String body){
car.setBody(body);
}
public void addElectrical(String electrical){
car.setElectrical(electrical);
}
public Car build(){
return car;
}
}
运行结果:Car{engine='发动机', chassis='底盘', body='车身', electrical='电器设备'}我们看下类图:public class Test {
public static void main(String[] args) {
CarBuilder builder = new CarBuilder();
builder.addEngine("发动机");
builder.addBody("车身");
builder.addChassis("底盘");
builder.addElectrical("电器设备");
System.out.println(builder.build());
}
}
建造者模式的链式写法
测试类:public class CarBuilder {
private Car car = new Car();
public CarBuilder addEngine(String engine){
car.setEngine(engine);
return this;
}
public CarBuilder addChassis(String chassis){
car.setChassis(chassis);
return this;
}
public CarBuilder addBody(String body){
car.setBody(body);
return this;
}
public CarBuilder addElectrical(String electrical){
car.setElectrical(electrical);
return this;
}
public Car build(){
return car;
}
}
看下类图:public class Test {
public static void main(String[] args) {
CarBuilder builder = new CarBuilder();
builder.addEngine("发动机").addBody("车身").addChassis("底盘").addElectrical("电器设备");
System.out.println(builder.build());
}
}
建造者模式应用案例
首先来看 JDK 的 StringBuilder,它提供 append()方法,给我们开放构造步骤,最后调用 toString()方法就可以获得一个构造好的完整字符串,源码如下:
@Overridepublic StringBuilder append(String str) { super.append(str); return this;}
当然其他的源码中也有很多,不胜枚举,总之构建者模式还是比较常用的一种设计模式。
建造者模式的优缺点
建造者模式的优点:
1、封装性好,创建和使用分离
2、扩展性好,建造类之间独立、一定程度上解耦
建造者模式的缺点:
1、产生多余的 Builder 对象
2、产品内部发生变化,建造者都要修改,成本较大