1 概述
1.1 定义
将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
1.2 通用类图
product类是要建造的产品,一般是使用了模板方法模式,也就是有模板方法和基本方法。
builderl类为抽象建造者,规范产品的组建,一般由子类实现。
concrebuilder为具体建造者,实现抽象类中的所有方法,并返回一个组建好的对象。
director导演类,负责安排已有模块的顺序。需要什么产品,什么具体顺序要求在这里定义。
说明:建造者模式强调的是基本方法的调用顺序。
1.3 优点
封装性好:客户端不知道产品组成细节。
建造者独立,容易扩展:每个建造者之间相互独立。
便于控制风险:每个建造者控制对应产品,不会对其他产生影响。
1.4使用场景
相同方法,不同的执行顺序,产生不同时间结果时;
多个部件或零件都可以装配到一个对象中,但是产生的运行结果又不相同时;
产品非常复杂,或产品类中的调用顺序不同产生不同的效能时;
在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时;
2 示例代码
首先创建产品抽象类和产品:
/**
* @author chiangtaol
* @date 2020-11-26
* @describe 汽车模型抽象类
*/
public abstract class CarModel {
private List<CarFunction> sequence = new ArrayList<>();
/**
* 汽车启动
*/
abstract void start();
/**
* 汽车停止
*/
abstract void stop();
/**
* 喇叭
*/
abstract void alarm();
/**
* 声浪
*/
abstract void voice();
/**
* 模型功能的顺序
* @param sequence 自定义的顺序
*/
final public void setSequence(ArrayList<CarFunction> sequence){
this.sequence = sequence;
}
/**
* 建造模型
*/
final public void run(){
for (CarFunction function : this.sequence){
switch (function){
case START:
this.start();
break;
case STOP:
this.stop();
break;
case ALARM:
this.alarm();
break;
case VOICE:
this.voice();
break;
default:
System.out.println("俺不信能走到这里!!!");
break;
}
}
}
}
/**
* @author chiangtaol
* @date 2020-11-27
* @describe 奔驰模型实现类
*/
public class BenzModel extends CarModel {
/**
* 汽车启动
*/
@Override
void start() {
System.out.println("奔驰这样启动...");
}
/**
* 汽车停止
*/
@Override
void stop() {
System.out.println("奔驰这样停止...");
}
/**
* 喇叭
*/
@Override
void alarm() {
System.out.println("奔驰这样响的...");
}
/**
* 声浪
*/
@Override
void voice() {
System.out.println("奔驰声浪是这样的...");
}
}
然后定义建造者和其实现类
/**
* @author chiangtaol
* @date 2020-11-27
* @describe 汽车模型建造抽象类
*/
public abstract class CarBuilder {
public abstract void setSequence(ArrayList<CarFunction> sequence);
public abstract CarModel getCar();
}
/**
* @author chiangtaol
* @date 2020-11-27
* @describe 奔驰模型建造者
*/
public class BenzBuilder extends CarBuilder{
private BenzModel benzModel= new BenzModel();
@Override
public void setSequence(ArrayList<CarFunction> sequence) {
this.benzModel.setSequence(sequence);
}
@Override
public CarModel getCar() {
return this.benzModel;
}
}
最后定义导演类来开始定义产品功能的顺序,其中宝马类和奔驰类似,不再贴出。
/**
* @author chiangtaol
* @date 2020-11-27
* @describe 模型功能
*/
public enum CarFunction {
START,
STOP,
ALARM,
VOICE;
}
/**
* @author chiangtaol
* @date 2020-11-27
* @describe 模型定义类
*/
public class Director {
private ArrayList<CarFunction> list = new ArrayList<>();
private CarBuilder builderBWM = new BWMBuilder();
private CarBuilder builderBenz = new BenzBuilder();
/**
* 宝马模型1,只会启动停止
* @return /
*/
public CarModel getBWMModel1(){
list.clear();
list.add(CarFunction.START);
list.add(CarFunction.STOP);
builderBWM.setSequence(list);
return builderBWM.getCar();
}
/**
* 宝马模型2,功能全都有
* @return
*/
public CarModel getBWMModel2(){
list.clear();
list.add(CarFunction.START);
list.add(CarFunction.ALARM);
list.add(CarFunction.VOICE);
list.add(CarFunction.STOP);
builderBWM.setSequence(list);
return builderBWM.getCar();
}
/**
* 奔驰模型1,只会启动停止
* @return /
*/
public CarModel getBenzModel1(){
list.clear();
list.add(CarFunction.START);
list.add(CarFunction.STOP);
builderBenz.setSequence(list);
return builderBenz.getCar();
}
/**
* 奔驰模型2,功能全都有
* @return
*/
public CarModel getBenzModel2(){
list.clear();
list.add(CarFunction.START);
list.add(CarFunction.ALARM);
list.add(CarFunction.VOICE);
list.add(CarFunction.STOP);
builderBenz.setSequence(list);
return builderBenz.getCar();
}
}
调用方就可以直接调用想要产品的对应方法即可,完全屏蔽产品内部细节
/**
* @author chiangtaol
* @date 2020-11-27
* @describe
*/
class DirectorTest {
@Test
void getModel() {
// 创建导演类
Director director = new Director();
// 得到指定产品并运行
director.getBenzModel1().run();
System.out.println("---------------------");
director.getBenzModel2().run();
System.out.println("=====================");
director.getBWMModel1().run();
System.out.println("---------------------");
director.getBWMModel2().run();
}
}
//结果如下
奔驰这样启动...
奔驰这样停止...
---------------------
奔驰这样启动...
奔驰这样响的...
奔驰声浪是这样的...
奔驰这样停止...
=====================
宝马这样启动...
宝马这样停止...
---------------------
宝马这样启动...
宝马这样响...
宝马声浪是这样的...
宝马这样停止...