- 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 与模板模式类似,建造者模式增加建造者且模板父类中增加了方法执行顺序变量sequence
- 建造者实现两个方法:一个返回要建造的对象,另一个设置要建造的对象中的通用方法中调用自身方法的顺序
- Client中实例sequence和具体Builder,并执行Builder中的model的某方法。
- 具体建建类封装了构建细节,并返回构建好的对象。
- 与工厂模式的区别:建造者模块关注方法执行的顺序(方法本身已实现),即零件的组装顺序不同产生的对象也不同;工厂模式关注零件本身的创建,不关注组装顺序。
- 代码
public abstract class Model {
private ArrayList<String> sequence = new ArrayList<String>();
public final void setSequence(ArrayList<String> sequence){
this.sequence = sequence;
}
final public void run(){
for(int i=0;i<sequence.size();i++){
String nowOrperate = sequence.get(i);
if(nowOrperate.equals("start")){
this.start();
}else if(nowOrperate.equals("alarm")){
this.alarm();
}else if(nowOrperate.equals("stop")){
this.stop();
}
}
}
protected abstract void start();
protected abstract void alarm();
protected abstract void stop();
}
public class ModelA extends Model{
protected void start() {
System.out.println("车辆A启动");
}
protected void alarm() {
System.out.println("车辆A鸣笛");
}
protected void stop() {
System.out.println("车辆A刹车");
}
}
public class ModelB extends Model{
protected void start() {
System.out.println("车辆B启动");
}
protected void alarm() {
System.out.println("车辆B鸣笛");
}
protected void stop() {
System.out.println("车辆B刹车");
}
}
public abstract class Builder {
public abstract void setSequence(ArrayList<String> sequence);
public abstract Model getModel();
}
public class BuilderA extends Builder{
private ModelA modelA = new ModelA();
public void setSequence(ArrayList<String> sequence) {
modelA.setSequence(sequence);
}
public Model getModel() {
return modelA;
}
}
public class BuilderB extends Builder{
private ModelB modelB = new ModelB();
public void setSequence(ArrayList<String> sequence) {
modelB.setSequence(sequence);
}
public Model getModel() {
return modelB;
}
}
public class Client {
public static void main(String[] args){
ArrayList<String> sequence1 = new ArrayList<String>();
sequence1.add("alarm");
sequence1.add("start");
sequence1.add("stop");
Builder builderA = new BuilderA();
builderA.setSequence(sequence1);
builderA.getModel().run();
ArrayList<String> sequence2 = new ArrayList<String>();
sequence2.add("start");
sequence2.add("alarm");
sequence2.add("stop");
Builder builderB = new BuilderB();
builderB.setSequence(sequence2);
builderB.getModel().run();
}
}