建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。创造型设计模式,它提供了一种创建对象的最佳方式。
使用场景
1.初始化一个特别复杂的对象,如参数多,且很多参数都具有默认值时。
2.相同的方法,不同的执行顺序,产生不同的时间结果时。
优点
1.良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节
2.建造者独立,易扩展。
缺点
1.产品必须有共同点,范围有限制。
2.如果内部结构变化复杂,会有很多的建造类。
import org.junit.Test;
/**
* ================================================
* 作 者:zhoujianan
* 版 本:v1.0
* 创建日期:2019/11/15
* 描 述:
* 修订历史:
* ================================================
*/
public class 建造者 {
@Test
public void main() {
Builder builder = new MacBuilder();
Director director = new Director(builder);
director.contractor("因特尔主板", "Retina 显示器");
System.out.println("computer info " + builder.create().toString());
}
public class Director {
Builder mBuilder;
public Director(Builder builder) {
mBuilder = builder;
}
public void contractor(String board, String diaplay) {
mBuilder.buildBoard(board).buildDisplay(diaplay).buildOs();
}
}
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOs;
protected Computer() {
}
protected abstract void setOS();
public void setBoard(String board) {
mBoard = board;
}
public void setDisplay(String display) {
mDisplay = display;
}
@Override
public String toString() {
return "Computer{" +
"mBoard='" + mBoard + '\'' +
", mDisplay='" + mDisplay + '\'' +
", mOs='" + mOs + '\'' +
'}';
}
}
public class MacBook extends Computer {
protected MacBook() {
}
@Override
protected void setOS() {
mOs = "Mac OS X 10.1.10";
}
}
public abstract class Builder {
public abstract Builder buildBoard(String board);
public abstract Builder buildDisplay(String diaplay);
public abstract Builder buildOs();
public abstract Computer create();
}
public class MacBuilder extends Builder {
private Computer macComputer = new MacBook();
@Override
public Builder buildBoard(String board) {
macComputer.setBoard(board);
return this;
}
@Override
public Builder buildDisplay(String display) {
macComputer.setDisplay(display);
return this;
}
@Override
public Builder buildOs() {
macComputer.setOS();
return this;
}
@Override
public Computer create() {
return macComputer;
}
}
}