持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
今天我们来看看java中的建造者模式,建造者模式和工厂模式、抽象工厂模式一样,也是一种创建型设计模式(creational design pattern),
建造者模式
建造者模式的引入是为了解决对象属性过多的问题,当使用工厂和抽象工厂的时候
使用工厂或者抽象工厂时,如果对象属性过多,主要存在下面三个问题
- 太多的参数传递给工厂类的时候很多时候肯能弄错,相同类型的参数在客户端调用时很难维护参数顺序
- 一些参数可能不是必填的,但是在工厂模式中,我们强制传递所有的参数,一些可选的参数会被设置为null
- 如果对象过重,创建将变得复杂,这些复杂度将成为工厂类的一部分让人费解
我们可以通过提供一个有必填参数的构造方法来解决这个问题,然后通过setter方法来解决可选参数的问题。但这个方法会带来对象状态不一致的问题,除非所有的对象属性都被设置了(这儿的意思是构造方法没有初始化所有的属性)
建造者模式通过提供按步创建对象的方法,用来解决大量可选参数和对象状态不一致的问题,并最后返回一个最终对象
java中的建造者模式
让我们看看怎么在java中实现一个建造者模式
- 首先创建一个内部静态类,然后拷贝所有外部的属性到这个内部Builder类里。我们应该遵守一个命名规范,比如类的名字是Computer,那么内部builder类的名字应该叫做ComputerBuilder
- Bulider类应该有一个公共的拥有所有必填参数构造方法
- Builder类应该有设置可选参数的setter方法,并且这些方法的返回值也是Builder类
- Builder最后一步应该提供一个build()方法, 用来返回一个客户端需要的对象。我们应该有一个以Builder为参数私有构造方法
这儿有一个建造者模式的例子代码,创建了一个 Computer和ComputerBuilder类来构建它
package com.journaldev.design.builder;
public class Computer {
//required parameters
private String HDD;
private String RAM;
//optional parameters
private boolean isGraphicsCardEnabled;
private boolean isBluetoothEnabled;
public String getHDD() {
return HDD;
}
public String getRAM() {
return RAM;
}
public boolean isGraphicsCardEnabled() {
return isGraphicsCardEnabled;
}
public boolean isBluetoothEnabled() {
return isBluetoothEnabled;
}
private Computer(ComputerBuilder builder) {
this.HDD=builder.HDD;
this.RAM=builder.RAM;
this.isGraphicsCardEnabled=builder.isGraphicsCardEnabled;
this.isBluetoothEnabled=builder.isBluetoothEnabled;
}
//Builder Class
public static class ComputerBuilder{
// required parameters
private String HDD;
private String RAM;
// optional parameters
private boolean isGraphicsCardEnabled;
private boolean isBluetoothEnabled;
public ComputerBuilder(String hdd, String ram){
this.HDD=hdd;
this.RAM=ram;
}
public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) {
this.isGraphicsCardEnabled = isGraphicsCardEnabled;
return this;
}
public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) {
this.isBluetoothEnabled = isBluetoothEnabled;
return this;
}
public Computer build(){
return new Computer(this);
}
}
}
可以看到Computer只有getter方法,并且没有公共的构造方法,因此我们只能通过ComputerBuilder来构造Computer类 下面是一个测试例子来看怎么通过Builder类来创建一个对象
package com.journaldev.design.test;
import com.journaldev.design.builder.Computer;
public class TestBuilderPattern {
public static void main(String[] args) {
//Using builder to get the object in a single line of code and
//without any inconsistent state or arguments management issues
Computer comp = new Computer.ComputerBuilder(
"500 GB", "2 GB").setBluetoothEnabled(true)
.setGraphicsCardEnabled(true).build();
}
}
建造者模式在JDK中的应用
这儿又一些java 类里面的建造者模式的应用
- java.lang.StringBuilder#append() (unsynchronized)
- java.lang.StringBuffer#append() (synchronized)
这就是java中的建造者模式