定义
The intent of the Builder design pattern is to separate the construction of a complex object from its representation. By doing so the same construction process can create different representations.
将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。
问题
例如,我们要创建一个房屋 House对象。建造一栋简单的房屋,我们知道门、窗和屋顶是必须的,但是如果想要更豪华的房子,比如建造一个带泳池的,带后院的等等,又该怎么办呢?
最简单的方法是扩展 House 基类,然后创建一系列涵盖所有组合的子类。最终将面临相当多的子类。任何新增的参数(例如多个烟囱)都会让整个层次结构更加复杂。
第二种是在房屋的基类创建一个包含所有可能参数的超级构造函数,这种方法虽然可以避免子类,但是,通常情况下, 绝大部分的参数都没有使用, 这使得对于构造函数的调用十分不简洁。
生成器模式
如何实现
- 在 House 中创建一个静态内部类 Builder,然后将Hosue中的参数都复制到 Builder类中。
- 在House 中创建一个private的构造函数,参数为Builder类型。
- 在Builder中创建一个public的构造函数,参数为House 中必填的那些参数,door(门) 和window(窗)。
- 在Builder中创建设置函数,对House 中那些可选参数进行赋值,返回值为Builder类型的实例。
- 在Builder中创建一个build()方法,在其中构建House的实例并返回。
public class House {
private final String door;//必须
private final String window;//必须
private final String roof;//可选
private final String pool;//可选
private final String backyard;//可选
private House(Builder builder){
this.door=builder.door;
this.window=builder.window;
this.roof=builder.roof;
this.pool=builder.pool;
this.backyard=builder.backyard;
}
public static class Builder{
private String door;//必须
private String window;//必须
private String roof;//可选
private String pool;//可选
private String backyard;//可选
public Builder(String door,String window){
this.door=door;
this.window=window;
}
public Builder setRoof(int roof) {
this.roof = roof;
return this;
}
public Builder setPool(String pool) {
this.pool = pool;
return this;
}
public Builder setBackyard(String backyard) {
this.backyard = backyard;
return this;
}
public House build(){
return new House(this);
}
}
//省略getter方法
}
如何使用
House house=new House.Builder("木质门","铝合金门窗")
.setRoof("玻璃屋顶")
.setPool("露天泳池")
.setBackyard("100平后院")
.build();
总结
builder设计模式
Builder设计模式就像是搭积木一样,它将复杂对象的构建过程拆解成多个简单的步骤,并提供一个建造者(Builder)来逐步构建对象。这样,你可以根据需要选择性地执行每个步骤,最终得到不同的对象表示形式。就像通过不同的积木组合,可以构建出不同的形状和结构一样。这种方式使得构建过程更加灵活、可扩展,同时保持了代码的可读性和可维护性。
什么情况下使用
当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。
优点
1、可以分步创建对象。
2、生成不同形式的产品时,可以复用相同的构造代码。
3、单一职责原则。 你可以将复杂构造代码从产品的业务逻辑中分离出来。
单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计原则中的一条基本原则,它指导着我们在设计类时应该保持职责的单一性。
根据单一职责原则,一个类应该只有一个引起它变化的原因。换句话说,一个类应该只有一个主要的责任或关注点。这样设计的类具有高内聚性(Cohesion),即类的各个成员函数和属性紧密相关,共同完成某个明确的功能。