场景:设计一个汽车简易制造工艺流程
该模块中主要包括两个部分:
1.汽车制造模型
2.汽车组装过程
建造者模式:
定义:将一个复杂对象的构建与它的标示分离,使得同样的构建过程可以创建不同的目标
在建造者模式中,有如下4个角色:
Produce产品类:
通常是实现了模版模式(Template);
Builder抽象建造者:
规范产品的组件,一般由子类实现;
ConcreteBuilder具体建造者:
实现抽象类定义的所有方法,并且返回一个组建好的对象;
Director导演类:
负载安排已有模块的顺序,然后告诉Builder开始建造。
场景问题解决类图:
主要涉及如下几个角色:
1.车辆模型的抽象类
2.奔驰模型
3.宝马模型
4.抽象汽车建造者
5.宝马建造者
6.奔驰建造者
7.导演类
8.场景类
代码实现:
CarModel:
public abstract class CarModel {
private ArrayList<String> squence = new ArrayList<String>();
protected abstract void start();
protected abstract void stop();
protected abstract void alarm();
protected abstract void engieBoom();
final public void run() {
for (int i = 0; i < squence.size(); i++) {
String actionName = this.squence.get(i);
if (actionName.trim().equalsIgnoreCase("start")) {
this.start();
}else if (actionName.trim().equalsIgnoreCase("stop")) {
this.stop();
}else if (actionName.trim().equalsIgnoreCase("alarm")) {
this.alarm();
}else if (actionName.trim().equalsIgnoreCase("engine alarm")) {
this.engieBoom();
}
}
}
final public void setSequence(ArrayList<String> sequence) {
this.squence = sequence;
}
}
BenzModel:
public class BenzModel extends CarModel {
@Override
protected void start() {
// TODO Auto-generated method stub
}
@Override
protected void stop() {
// TODO Auto-generated method stub
}
@Override
protected void alarm() {
// TODO Auto-generated method stub
}
@Override
protected void engieBoom() {
// TODO Auto-generated method stub
}
}
BWMModle:
public class BWMModel extends CarModel {
@Override
protected void start() {
// TODO Auto-generated method stub
}
@Override
protected void stop() {
// TODO Auto-generated method stub
}
@Override
protected void alarm() {
// TODO Auto-generated method stub
}
@Override
protected void engieBoom() {
// TODO Auto-generated method stub
}
}
CarBuilder:
public abstract class CarBuild {
public abstract void setSequence(ArrayList<String> sequence);
public abstract CarModel getCarModel();
}
BenzBuilder:
public class BenzBuild extends CarBuild {
private BenzModel benzModel = new BenzModel();
@Override
public void setSequence(ArrayList<String> sequence) {
this.benzModel.setSequence(sequence);
}
@Override
public CarModel getCarModel() {
return this.benzModel;
}
}
BWMBuilder:
public class BWMBuild extends CarBuild {
private BWMModel bwmModel = new BWMModel();
@Override
public void setSequence(ArrayList<String> sequence) {
this.bwmModel.setSequence(sequence);
}
@Override
public CarModel getCarModel() {
// TODO Auto-generated method stub
return this.bwmModel;
}
}
Director:
public class Director {
private ArrayList<String> sequence = new ArrayList<String>();
private BenzBuild benzBuild = new BenzBuild();
private BWMBuild bwmBuild = new BWMBuild();
public BenzModel getABenzModel() {
this.sequence.clear();
this.sequence.add("start");
this.sequence.add("stop");
this.benzBuild.setSequence(sequence);
return (BenzModel)this.benzBuild.getCarModel();
}
public BenzModel getBBenzModel() {
this.sequence.clear();
this.sequence.add("engine boom");
this.sequence.add("start");
this.sequence.add("stop");
this.benzBuild.setSequence(sequence);
return (BenzModel) this.benzBuild.getCarModel();
}
public BWMModel getBwmModel() {
this.sequence.clear();
this.sequence.add("start");
this.sequence.add("stop");
this.bwmBuild.setSequence(sequence);
return (BWMModel) bwmBuild.getCarModel();
}
}
Client:
public class Client {
public static void main(String[] agrs) throws Exception {
Director director = new Director();
director.getABenzModel().run();
director.getBBenzModel().run();
director.getBwmModel().run();
}
}
建造者的优点:
1.使用建造者模式可以使得客户端不必知道产品内部组成的细节;
2.建造者独立,容易扩展;
3.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
建造者模式的使用场景
1.相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用;
2.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用;
3.产品类非常复杂,或者产品类中调用顺序不同产生了不同的效果;
4.在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用。