建造者模式
使用场景:
- 多个部件或者零件,都可以装配到一个对象中,但是产生的运行结果又相同。
- 产品类非常复杂,或者产品类中调用顺序不同产生了不同的作用。
- 初始化一个对象特别复杂,如使用多个构造方法,或者说有很多参数,并且都有默认值时。
建造者模式类的组成
- Product(产品类):需要为其构建对象的类,是具有不同表现形式的复杂或复合类对象。
- Builder(抽象建造者类):用于声明构建产品类的组成部分的抽象类或接口,作用是仅公开构建产品类的功能,隐藏其他功能。
- ConcreteBuilder(具体建造者类):实现抽象建造者类中声明的方法。
- Director(导演类):用于指导如何构建对象的类,在某些建造者模式的变体中移除了导演类,其角色被客户端或抽象建造者类所替代。
1. 普通建造者模式
UML图
//Computer.java 产品抽象类
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOs;
protected Computer() {
}
public void setBoard(String board) {
mBoard = board;
}
public void setDisplay(String display) {
this.mDisplay = display;
}
public abstract void setOs();
}
//MacBook.java
public class MacBook extends Computer {
@Override
public void setOs() {
mOs="Mac OS X 12";
}
}
//Builder.java 抽象建造者类
public abstract class Builder {
abstract void buildBoard(String board);
abstract void buildDisplay(String display);
abstract void buildOs();
abstract Computer build();
}
//MacBookBuilder.java 具体建造者类
public class MacBookBuilder extends Builder {
private Computer mComputer = new MacBook();
@Override
void buildBoard(String board) {
mComputer.setBoard(board);
}
@Override
void buildDisplay(String display) {
mComputer.setDisplay(display);
}
@Override
void buildOs() {
mComputer.setOs();
}
@Override
Computer build() {
return mComputer;
}
}
//Director.java 导演类
public class Director {
private Builder builder = null;
public Director(Builder builder) {
this.builder = builder;
}
public void construct(String board, String display) {
builder.buildDisplay(display);
builder.buildBoard(board);
builder.buildOs();
}
}
//Main.java
public class Main {
public static void main(String[] args) {
Builder builder = new MacBookBuilder();
Director director = new Director(builder);
director.construct("英特尔主板", "Retina显示器");
Computer computer = builder.build();
System.out.println(computer.toString());
}
}
2. 链式建造者模式(推荐)
上面那部分代码可以看出普通的建造者模式有点复杂,且调用时不够简单。
这时可以使用更简单好用的链式建造者模式。如果不想自己敲的话可以使用IDEA中的一个叫InnerBuilder
插件进行自动生成。
public class Computer {
protected String mBoard;
protected String mDisplay;
protected Computer() {
}
private Computer(Builder builder) {
mBoard = builder.mBoard;
mDisplay = builder.mDisplay;
}
public void setBoard(String board) {
mBoard = board;
}
public void setDisplay(String display) {
this.mDisplay = display;
}
@Override
public String toString() {
return "Computer{" +
"mBoard='" + mBoard + '\'' +
", mDisplay='" + mDisplay + '\'' +
'}';
}
/**
* InnerBuilder插件生成的链式建造者类
*/
public static final class Builder {
private String mBoard;
private String mDisplay;
public Builder() {
}
public Builder mBoard(String val) {
mBoard = val;
return this;
}
public Builder mDisplay(String val) {
mDisplay = val;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}
//Main.java
public class Main {
public static void main(String[] args) {
Computer computer = new Computer.Builder()
.mBoard("intel atx")
.mDisplay("1920x1080")
.build();
}
}