创建型之建造者模式
定义与特点
建造者模式的定义:又称为“生成器模式”,指将一个复杂对象的构建和它的表现分离,使同样的构建过程可以有不同表现。
优点:
- 封装性好,构建和表现分离
- 扩展性好,各个具体的建造者相互独立,有利于系统的解耦
- 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其他模块产生影响,便于控制细节风险。
缺点:
- 产品的组成部分必须相同,这限制了其使用范围
- 如果产品的内部变化复杂,则建造者也要同步修改,后期维护成本大
建造者模式和工厂模式的关注点不同: 工厂模式注重零部件的生产,而建造者注重零部件的组合,两者可以结合使用。
模式结构
建造者模式的主要角色如下:
- 产品角色(Product):包含多个组成部件的复杂对象
- 抽象建造者(Builder):包含创建产品各个子部件的抽象方法的接口
- 具体建造者(Concreate Builder):实现Builder接口,完成复杂产品的各个部件的具体创建方法
- 指挥者(Director):调用创建者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
实例
- CarModel
package com.cap.creationalpatterns.builderpattern;
import java.util.ArrayList;
abstract class CarModel {
private ArrayList<String> sequence = new ArrayList<>();
// 启动
protected abstract void start();
// 停止
protected abstract void stop();
// 喇叭
protected abstract void alarm();
// 引擎声音
protected abstract void engineBoom();
final public void run() {
for (String actionName : sequence) {
switch (actionName.toLowerCase()) {
case "start":
start();
break;
case "stop":
stop();
break;
case "alarm":
alarm();
break;
case "engine boom":
engineBoom();
break;
}
}
}
final public void setSequence(ArrayList<String> sequence) {
this.sequence = sequence;
}
}
- BenzModel和BMWModel
package com.cap.creationalpatterns.builderpattern;
class BenzModel extends CarModel {
@Override
protected void start() {
System.out.println("new BenzModel().start()");
}
@Override
protected void stop() {
System.out.println("new BenzModel().stop()");
}
@Override
protected void alarm() {
System.out.println("new BenzModel().alarm()");
}
@Override
protected void engineBoom() {
System.out.println("new BenzMode().eingineBoom()");
}
}