建造者模式:
优点:
使用建造者模式可以使客户端不必知道产品内部组成的细节。
具体的建造者类之间是相互独立的,这有利于系统的扩展。
具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。
缺点:
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
适用场景:
产品类非常复杂或者产品类因为调用顺序不同而产生不同作用
初始化一个对象时,参数过多,或者很多参数具有默认值
Builder模式不适合创建差异性很大的产品类
产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
值得一提的是建造者模式和静态内部类非常契合,使用静态内部类来完成建造者模式非常合适
以建造一个学生为例
/**
* @author Jay
* @date 2020/7/15 16:29
* @Description:
*/
public class Student {
private String name;
private String study;
private int hight;
private int weight;
private int IQ;
private int EQ;
public Student(Builder builder){
this.name=builder.name;
this.weight=builder.weight;
this.hight=builder.hight;
this.EQ=builder.EQ;
this.IQ=builder.IQ;
this.study=builder.study;
}
public static class Builder{
private String name;
private String study;
private int hight;
private int weight;
private int IQ;
private int EQ;
public Builder(){
}
public Builder Name(String val){
this.name=val;
return this;
}
public Builder IQ(int val){
this.IQ=val;
return this;
} public Builder EQ(int val){
this.EQ=val;
return this;
} public Builder Hight(int val){
this.hight=val;
return this;
}
public Builder Weight(int val){
this.weight=val;
return this;
}
public Builder Study(String val){
this.study=val;
return this;
}
public Student build(){
return new Student(this);
}
}
}
测试类
/**
* @author Jay
* @date 2020/7/15 16:39
* @Description:
*/
public class StudentMain {
public static void main(String[] args) {
Student student=new Student.Builder()
.EQ(80)
.Hight(176)
.IQ(80)
.Name("LiHua")
.Study("math")
.Weight(132)
.build();
}
}