建造者模式
又叫build模式
定义
将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
使用场景
当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。
解决什么问题
比如说我们有这么一个类 其中的 productName是必须要的,其余参数是可选的,我们通常用两种方式实例化类并给他们的成员变量赋值
class Product {
private final String productName;
private final String companyName;
private final String part1;
private final String part2;
private final String part3;
private final String part4;
}
折叠构造函数模式(telescoping constructor pattern )
就是多个不同参数的构造方法,这个我们经常用,如下代码所示,博主这边为了代码方便只写一个
/**
* 构造方法构造 g
*/
public Product(String productName, String companyName, String part1, String part2, String part3, String part4) {
this.productName = productName;
this.companyName = companyName;
this.part1 = part1;
this.part2 = part2;
this.part3 = part3;
this.part4 = part4;
}
Javabean 模式
就是set方法调用,由于为了掩饰特殊情况,成员变量被final 修饰了成了常量 无法使用set方法,所以就不演示了,这种情况下用build模式是最好的
两种方法比较
第一种主要是使用及阅读不方便。你可以想象一下,当你要调用一个类的构造函数时,你首先要决定使用哪一个,然后里面又是一堆参数,如果这些参数的类型很多又都一样,你还要搞清楚这些参数的含义,很容易就传混了。。。那酸爽谁用谁知道。
第二种方式在构建过程中对象的状态容易发生变化,造成错误。因为那个类中的属性是分步设置的,所以就容易出错。
为了解决这两个问题,builder模式就横空出世了。
bulid模式
- 在Product中创建一个静态内部类 Builder,然后将Computer 中的参数都复制到Builder类中。
- 在Product中创建一个private的构造函数,参数为Builder类型
- 在Builder中创建一个public的构造函数,参数为Product中必填的那些参数,cpu 和ram。
- 在Builder中创建设置函数,对Product中那些可选参数进行赋值,返回值为Builder类型的实例
- 在Builder中创建一个build()方法,在其中构建Computer的实例并返回
代码实现
@Getter
class Product {
private final String productName;
private final String companyName;
private final String part1;
private final String part2;
private final String part3;
private final String part4;
/**
* 构造方法构造
* @param productName
* @param companyName
* @param part1
* @param part2
* @param part3
* @param part4
*/
public Product(String productName, String companyName, String part1, String part2, String part3, String part4) {
this.productName = productName;
this.companyName = companyName;
this.part1 = part1;
this.part2 = part2;
this.part3 = part3;
this.part4 = part4;
}
//静态内部类方式构建
static class Builder{
private String productName;
private String companyName;
private String part1;
private String part2;
private String part3;
private String part4;
public Builder setProductName(String productName) {
this.productName = productName;
return this;
}
public Builder setCompanyName(String companyName) {
this.companyName = companyName;
return this;
}
public Builder setPart1(String part1) {
this.part1 = part1;
return this;
}
public Builder setPart2(String part2) {
this.part2 = part2;
return this;
}
public Builder setPart3(String part3) {
this.part3 = part3;
return this;
}
public Builder setPart4(String part4) {
this.part4 = part4;
return this;
}
//build模式把参数赋值给成员变量,把创建对象的权力交给自己
public Product build(){
return new Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4);
}
}
}