建造者模式:
将构建复杂对象的过程和它的部件解耦,使得构建构成和部件隔离开来,使得同样的构造过程可以创建不同的表示,如生产电脑的过程等。可以看成做东西,怎么做(Director)?做什么(Product)?谁来做(Builder)?来看待该模式。
使用场景:
1.相同的方法不同的执行顺序,产生不同的事件结果。
2.当初始化一个对象特别复杂,如参数特别多或者很多参数具有默认值时。—>链式构造
UML类图:
建造类使用产品类,Director使用抽象构造类,
Builder模式的简单实现:
//抽象产品类,包含需要组装的各部分
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOs;
protected Computer(){
}
public void setmDisplay(String mDisplay) {
this.mDisplay = mDisplay;
}
public void setmOs() {
}
public void setmBoard(String mBoard) {
this.mBoard = mBoard;
}
@Override
public String toString() {
return "Computer{" +
"mBoard='" + mBoard + '\'' +
", mDisplay='" + mDisplay + '\'' +
", mOs='" + mOs + '\'' +
'}';
}
}
//具体的产品类
public class MacBook extends Computer {
public MacBook() {
}
public void setmOs() {
mOs = "Mac OS X 10.10";
}
}
//抽象建造类,包含一些生产方法和创建产品实例
public abstract class Builder {
public abstract void buildBoard(String board);
public abstract void buildDisplay(String display);
public abstract void buildOS();
public abstract Computer create();
}
//具体的建造类
public class MacBookBuilder extends Builder {
private Computer computer = new MacBook();
@Override
public void buildBoard(String board) {
computer.setmBoard(board);
}
@Override
public void buildDisplay(String display) {
computer.setmDisplay(display);
}
@Override
public void buildOS() {
computer.setmOs();
}
@Override
public Computer create() {
return computer;
}
}
public class Director {
Builder builder = null;
public Director(Builder builder) {
this.builder = builder;
}
//构造方法规定了具体的生产流程,和需要的组件。而实际的生产则依赖传入的Builder。可以把这个Builder看成是工人,而Director看成是流水线。
public void construct(String board,String display){
builder.buildBoard(board);
builder.buildDisplay(display);
builder.buildOS();
}
}
public class BuilderTest {
public static void main(){
Builder builder = new MacBookBuilder();
Director director = new Director(builder);
director.construct("英特尔主板","Retine显示器");
System.out.print(builder.create().toString());
}
}
这里Builder域Director一起将一个复杂对象的构建与他的表现分离,使得同样的构建过程可以创建不同的对象。
思考:需要重点理清Director 和Builder的意义