简介:
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。
1. 定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2. 解决的问题
- 在建造者模式中, 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
- 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,
用户使用不同的具体建造者即可得到不同的产品对象。 - 可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
- 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。
3. 例子
package build.builder;
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/7 11:07
* @Desc: as follows.
*/
public class Skate {
/**
* 轮滑鞋名称
*/
private String name;
/**
* 类型,成人,儿童
*/
private String type;
/**
* 轮子数量
*/
private Integer wheelAmount;
/**
* 颜色
*/
private String color;
/**
* 用途,极限,花式等
*/
private String use;
static class SkateBuilder{
private String name;
private String type;
private Integer wheelAmount;
private String color;
private String use;
SkateBuilder name(String name){
this.name = name;
return this;
}
SkateBuilder type(String type){
this.type = type;
return this;
}
SkateBuilder wheelAmount(Integer wheelAmount){
this.wheelAmount = wheelAmount;
return this;
}
SkateBuilder color(String color){
this.color = color;
return this;
}
SkateBuilder use(String use){
this.use = use;
return this;
}
Skate build(){
return new Skate(this.name, this.type, this.wheelAmount, this.color, this.use);
}
}
public Skate(String name, String type, Integer wheelAmount, String color, String use) {
this.name = name;
this.type = type;
this.wheelAmount = wheelAmount;
this.color = color;
this.use = use;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Integer getWheelAmount() {
return wheelAmount;
}
public void setWheelAmount(Integer wheelAmount) {
this.wheelAmount = wheelAmount;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getUse() {
return use;
}
public void setUse(String use) {
this.use = use;
}
@Override
public String toString() {
return "Skate{" +
"name='" + name + '\'' +
", type='" + type + '\'' +
", wheelAmount=" + wheelAmount +
", color='" + color + '\'' +
", use='" + use + '\'' +
'}';
}
public static void main(String[] args) {
Skate skate = new SkateBuilder().name("HV").type("成人").color("黑色").wheelAmount(8).use("花式刹停").build();
System.out.println(skate);
}
}
输出:
Skate{name='HV', type='成人', wheelAmount=8, color='黑色', use='花式刹停'}
4. 思考
建造者模式可以灵活的创建一个自己需要属性的类,自由组合,链式调用,代码可读性强,但是代码量会成倍增长。