建造者模式
定义
将一个复杂的对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示。
场景
初始化一个对象特别复杂,如使用多个构造方法,或者说有很多参数,并且都有默认值时。
一般4个以上参数,考虑使用建造者模式创建对象。
为什么使用建造者
当你要调用一个类的构造函数时,你首先要决定使用哪一个,然后里面又是一堆参数,如果这些参数的类型很多又都一样,你还要搞清楚这些参数的含义,很容易就传混了
UML图
实现
public abstract class Computer {
protected String name;
protected String mouse;
protected String keyboard;
public Computer() {
}
public abstract void setName() ;
public void setMouse(String mouse) {
this.mouse = mouse;
}
public void setKeyboard(String keyboard) {
this.keyboard = keyboard;
}
@Override
public String toString() {
return "Computer{" +
"name='" + name + '\'' +
", mouse='" + mouse + '\'' +
", keyboard='" + keyboard + '\'' +
'}';
}
}
public class MacComputer extends Computer {
@Override
public void setName() {
name = "Mac";
}
}
public abstract class Builder {
abstract void buildMouse(String mouse);
abstract void buildKeyboard(String keyboard);
abstract void buildName();
abstract Computer build();
}
public class MacBuilder extends Builder {
private MacComputer macComputer = new MacComputer();
@Override
void buildMouse(String mouse) {
macComputer.setMouse(mouse);
}
@Override
void buildKeyboard(String keyboard) {
macComputer.setKeyboard(keyboard);
}
@Override
void buildName() {
macComputer.setName();
}
@Override
public Computer build() {
return macComputer;
}
@Override
public String toString() {
return "MacBuilder{" +
"macComputer=" + macComputer +
'}';
}
}
public class Directer {
Builder builder ;
public Directer(Builder builder) {
this.builder = builder;
}
public void construct(String mouse, String keyboard){
builder.buildName();
builder.buildMouse(mouse);
builder.buildKeyboard(keyboard);
}
public static void main(String[] args) {
MacBuilder macBuilder = new MacBuilder();
new Directer(macBuilder).construct("Logic","Aoc");
System.out.println(macBuilder.build().toString());
}
}
总结
为了灵活构造复杂对象,该对象会有多个成员变量,在外部调用的时候,不需要或者不方便一次性创建出所有的成员变量,在这种情况下,使用多个构造方法去构建对象,很难维护,这时候Builder设计模式解决这个问题,进行buid()方法中创建对象,并且将builder传入,该builder中,维护了传入对象的成员变量。
文章来源
https://www.jianshu.com/p/f958ba891467
建造者简单实现
https://zhuanlan.zhihu.com/p/58093669