1. 建造者模式
对象的创建往往是复杂的,在软件开发过程中有时需要创建一个复杂的对象,这个复杂的对象通常由多个子部件按一定的步骤组合而成。比如房子有各式各样的,但建造方法的步骤大同小异都是先搭建地基、再砌墙、最后封盖屋顶。建造者模式旨在将一个复杂对象的构造与它的表示分离开来,使同样的构建过程可以创建不同的表示,建造者的角色如下:
- 产品:需要构建的对象,是具有不同表现形式的复杂或复合对象。
- 抽象建造者:用于声明构建产品类组成部分的抽象类或接口。
- 具体建造者:用于实现抽象建造者,实现具体的建造过程,生成完整产品。
- 指挥者:用于指挥如何构建产品。
例如生活中构建一个电脑产品,需要选择主机、显示器、键盘、鼠标来进行组装,客户提供具体的原材料描述需要一个什么样的电脑,设计师规划组装流程交给组装师建造,如下:
2. 建造者实现
通过建造者模式实现电脑的组装,要求组装一个主机为联想、显示器为华为、键盘和鼠标为小米的电脑。
2.1 产品类
新建一个产品类,类名称:Computer,内容如下:
public class Computer {
// 主机
private String host;
// 显示器
private String display;
// 键盘
private String keyboard;
// 鼠标
private String mouse;
public void setHost(String host) {
this.host = host;
}
public void setDisplay(String display) {
this.display = display;
}
public void setKeyboard(String keyboard) {
this.keyboard = keyboard;
}
public void setMouse(String mouse) {
this.mouse = mouse;
}
@Override
public String toString() {
return String.format("主机:%s 显示器:%s 键盘:%s 鼠标:%s", host, display, keyboard, mouse);
}
}
2.2 抽象建造者
新建一个抽象者类,类名称为:AbstractBuilder,内容如下:
public abstract class AbstractBuilder {
protected Computer product = new Computer();
// 组装主机
abstract protected void buildHost();
// 组装显示器
abstract protected void buildDisplay();
// 组装键盘
abstract protected void buildKeyboard();
// 组装鼠标
abstract protected void buildMouse();
// 获取成品
public Computer getProduct(){
return product;
}
}
2.3 具体建造者
新建一个建造者实现抽象建造者,类名称:ComputerBuilder,内容如下:
public class ComputerBuilder extends AbstractBuilder{
@Override
protected void buildHost() {
System.out.println("组装联想主机");
product.setHost("联想主机");
}
@Override
protected void buildDisplay() {
System.out.println("组装华为显示器");
product.setDisplay("华为显示器");
}
@Override
protected void buildKeyboard() {
System.out.println("组装小米键盘");
product.setKeyboard("小米键盘");
}
@Override
protected void buildMouse() {
System.out.println("组装小米鼠标");
product.setMouse("小米鼠标");
}
}
2.4 指挥者
新建一个指挥者,类名称:Director,内容如下:
public class Director {
private AbstractBuilder builder;
public Director(AbstractBuilder builder) {
this.builder = builder;
}
// 定义建造流程
public Computer construct(){
builder.buildHost();
builder.buildDisplay();
builder.buildKeyboard();
builder.buildMouse();
return builder.getProduct();
}
}
2.5 客户端
新建一个客户端需要一台电脑,类名称:Client,内容如下:
public class Client {
public static void main(String[] args) {
// 建造者
AbstractBuilder builder = new ComputerBuilder();
// 指挥者
Director director = new Director(builder);
// 生产产品
Computer product = director.construct();
// 获取产品规格
System.out.println(product.toString());
}
}
3. 建造者应用
在JDK的类库中StringBuilder就是建造者模式的体现,其类图结构如下:
- 产品:字符串,即AbstractStringBuilder类的char[] value
- 抽象建造者:Appendable接口定义了建造者的行为,即append方法
- 具体建造者:AbstractStringBuilder抽象类实现了Appendable接口,实现了append方法,它只是不能实例化而已
- 指挥者:StringBuilder类继承了AbstractStringBuilder类,StringBuilder的append方法都是super.append,StringBuilder只是一个门面。