定义
建造者模式(Build Pattern)是将一个复杂对象的创建过程与它的表示分离,使得同样的构建过程可以创建不同的的表示,属于创建型模式。使用建造者模式对于用户而言只需要指定建造的类型就可以获得对象,建造过程及细节不需要了解。
应用场景
- 建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。如果一个对象有非常复杂的内部结构(很多属性),可以将复杂对象的创建和使用进行分离;
- 建造者适用于一个具有较多的零件的复杂产品的创建过程,由于需求的变化,组成这个复杂产品的各个零件经常猛烈变化,但是他们的组合方法确相对稳定;
建造者模式适用于以下几种场景:
- 相同的方法,不同的执行顺序,产生不同的结果时;
- 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同;
- 产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用;
- 当初始化一个对象特别复杂,传参数多,而且有很多参数具有默认值时;
建造者模式的基本写法
我们以汽车为例,汽车的组成需要有很多零件,首先先创建一个产品类 Car:
@Data
@ToString
public class Car {
/**
* 名称
*/
private String name;
/**
* 品牌 LOGO
*/
private String logo;
/**
* 轮胎
*/
private String tires;
/**
* 座椅
*/
private String seat;
/**
* 屏幕
*/
private String screen;
}
然后我们创建建造者类,将复杂的构建过程封装起来,构建步骤由用户决定:
public class CarBuilder {
private Car car = new Car();
public void addName(String name) {
car.setName(name);
}
public void addSeat(String seat) {
car.setSeat(seat);
}
public void addScreen(String screen) {
car.setScreen(screen);
}
public void addLogo(String logo) {
car.setLogo(logo);
}
public void addTires(String tires) {
car.setTires(tires);
}
public Car build() {
return car;
}
}
编写测试类:
public class Test {
public static void main(String[] args) {
CarBuilder builder = new CarBuilder();
builder.addName("宝马");
builder.addLogo("BMW");
builder.addSeat("真皮座椅");
builder.addScreen("11英寸大中控屏幕");
builder.addTires("22英寸大轮毂");
System.out.println(builder.build());
}
}
看一下类图:
建造者模式的链式编程
在平时的应用中,建造者模式通常是采用链式编程的方式构造对象,下面来演示一下代码,产品类不变,修改我们的建造者类:
public class CarBuilder {
private Car car = new Car();
public CarBuilder addName(String name) {
car.setName(name);
return this;
}
public CarBuilder addSeat(String seat) {
car.setSeat(seat);
return this;
}
public CarBuilder addScreen(String screen) {
car.setScreen(screen);
return this;
}
public CarBuilder addLogo(String logo) {
car.setLogo(logo);
return this;
}
public CarBuilder addTires(String tires) {
car.setTires(tires);
return this;
}
public Car build() {
return car;
}
}
测试类:
public static void main(String[] args) {
CarBuilder builder = new CarBuilder()
.addName("宝马")
.addLogo("BMW")
.addSeat("真皮")
.addScreen("11英寸大中控屏幕")
.addTires("22英寸大轮毂");
System.out.println(builder.build());
}
建造者模式在源码中的体现
下面来看建造者模式在哪些源码中有应用呢?首先来看 JDK 中的 StringBuilder,它提供 append()方法,给我们开放构造步骤,最后用 toString()方法就可以获得一个完整的字符串,源码如下:
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
...
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
...
}
mybatis中的SqlSessionFactoryBuilder:
Spring 中的BeanDefinitionBuilder:
建造者模式的优缺点
优点:
- 封装性好,创建和使用分离就;
- 扩展性好,建造类之间独立、一定程度上解耦;
缺点:
- 产生多余的 Builder对象;
- 产品内部发生变化,建造者都需要改,成本较大;
建造者模式和工厂模式的区别
- 建造者模式更加注重方法的调用顺序,工厂模式注重于创建对象;
- 创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的组件组成,工厂模式创建出来的都一样(前者支持选配,后者不支持);
- 关注重点不一样,工厂模式只需要把对象创建出来就可以了,而建造者模式中不仅要创建出这个对象,还要知道这个对象又哪些部分组成;
- 建造者模式根据建造过程中的顺序不一样,最终的对象部件组成也不一样;
上一篇: 原型模式 https://blog.csdn.net/qq_20315217/article/details/114224897
下一篇: 代理模式 https://blog.csdn.net/qq_20315217/article/details/114294246