设计模式-建造者模式
2019-12-12 本文已影响0人
许笑山
建造者模式
建造者模式介绍
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式分析
建造者模式.png1.引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
2.具体的建造者用来实现抽象建造的方法,包括:组建产品,返回组建好的产品
3.指挥类:负责调用适当的建造者来组建产品,指挥类不与具体的产品发生依赖关系。
建造者模式的使用场景
1.创建复杂对象的算法独立于组成对象的部件
2.同一个创建过程需要有不同的内部表象的产品对象
建造者模式优缺点
优点
1.客户端不用关注生产细节
2.每个建造者都是独立的,用户使用不同的具体建造者可得到不同的产品对象
3.可以更加精细地控制产品的创建过程。
4.增加新的具体建造者无需修改原有代码
缺点
1.当建造者过多,会产生很多类
2.产品之间若共同点很少,则不适宜该模式。
3.若产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化
建造者模式示例代码
Builder相关类
Builder.java
public abstract class Builder {
public abstract Builder buildBoard(String board);
public abstract Builder buildDisplay(String display);
public abstract Builder buildOs();
public abstract Computer build();
}
MacBookBuilder.java
public class MacBookBuilder extends Builder {
private Computer computer = new MacBook();
@Override
public Builder buildBoard(String board) {
computer.setBoard(board);
return this;
}
@Override
public Builder buildDisplay(String display) {
computer.setDisplay(display);
return this;
}
@Override
public Builder buildOs() {
computer.setOs();
return this;
}
@Override
public Computer build() {
return computer;
}
}
MiBuilder.java
public class MiBuilder extends Builder {
private Computer computer = new MiBook();
@Override
public Builder buildBoard(String board) {
computer.setBoard(board);
return this;
}
@Override
public Builder buildDisplay(String display) {
computer.setDisplay(display);
return this;
}
@Override
public Builder buildOs() {
computer.setOs();
return this;
}
@Override
public Computer build() {
return computer;
}
}
实体相关类
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();
@Override
public String toString() {
return "Computer{" +
"mBoard='" + mBoard + '\'' +
", mDisplay='" + mDisplay + '\'' +
", mOs='" + mOs + '\'' +
'}';
}
}
MacBook.java
public class MacBook extends Computer {
@Override
public void setOs() {
mOs = "Mac OS X 12";
}
}
MiBook.java
public class MiBook extends Computer{
@Override
public void setOs() {
mOs = "Windows 10";
}
}
BuilderApplication.java
public class BuilderApplication {
public static void main(String[] args) {
Builder macBuilder = new MacBookBuilder();
Builder miBuilder = new MiBuilder();
Director dir = new Director();
dir.construct(miBuilder, "Intel", "IPS显示器");
dir.construct(macBuilder, "Intel", "Retina显示器");
Computer miComputer = miBuilder.build();
Computer macComputer = macBuilder.build();
System.out.println(miComputer);
System.out.println(macComputer);
}
}
运行结果
Computer{mBoard='Intel', mDisplay='IPS显示器', mOs='Windows 10'}
Computer{mBoard='Intel', mDisplay='Retina显示器', mOs='Mac OS X 12'}