描述:上一篇文章模板方法讲的抽象类中的普通方法可以在子类实现,按照需求可以实现自己的方法,算法是保持不变的;建造者模式跟模板方法不同之处是抽象类中的算法可以按需修改。
UML类图如下:
测试代码:
1、建造的产品抽象类
package com.java.builder;
import java.util.ArrayList;
import java.util.List;
public abstract class CarModel {
private List<String> sequence = new ArrayList<String>();
public List<String> getSequence() {
return sequence;
}
public void setSequence(List<String> sequence) {
this.sequence = sequence;
}
public abstract void start();
public abstract void alarm();
public abstract void engine();
public abstract void stop();
public void run(){
if(sequence != null && sequence.size() > 0){
for(String str : sequence){
if(str.equalsIgnoreCase("start")){
start();
}else if(str.equalsIgnoreCase("engine")){
engine();
}else if(str.equalsIgnoreCase("alarm")){
alarm();
}else if(str.equalsIgnoreCase("stop")){
stop();
}
}
}
}
}
2、具体产品类
package com.java.builder;
public class BenzCarModel extends CarModel {
@Override
public void start() {
System.out.println("奔驰车启动起来是这样子的...");
}
@Override
public void alarm() {
System.out.println("奔驰车喇叭声音是这样子的...");
}
@Override
public void engine() {
System.out.println("奔驰车引擎启动是这样子的...");
}
@Override
public void stop() {
System.out.println("奔驰车停止是这样子的...");
}
}
package com.java.builder;
public class BmwCarModel extends CarModel {
@Override
public void start() {
System.out.println("宝马车启动起来是这样子的...");
}
@Override
public void alarm() {
System.out.println("宝马车喇叭声音是这样子的...");
}
@Override
public void engine() {
System.out.println("宝马车引擎启动是这样子的...");
}
@Override
public void stop() {
System.out.println("宝马车停止是这样子的...");
}
}
3、建造者抽象类,客户需要的产品从这个类被建造出来
package com.java.builder;
import java.util.List;
public abstract class Builder {
public abstract void setSequence(List<String> sequence);
public abstract CarModel getCarModel();
}
4、具体建造者
package com.java.builder;
import java.util.List;
public class BenzCarBuilder extends Builder {
private BenzCarModel model = new BenzCarModel();
@Override
public void setSequence(List<String> list) {
this.model.setSequence(list);
}
@Override
public CarModel getCarModel() {
return this.model;
}
}
package com.java.builder;
import java.util.List;
public class BmwCarBuilder extends Builder {
private BmwCarModel model = new BmwCarModel();
@Override
public void setSequence(List<String> sequence) {
this.model.setSequence(sequence);
}
@Override
public CarModel getCarModel() {
return this.model;
}
}
5、建造的总工即包头工
package com.java.builder;
import java.util.ArrayList;
import java.util.List;
public class Director {
private BenzCarBuilder benzBuilder = new BenzCarBuilder();
private BmwCarBuilder bmwCarBuilder = new BmwCarBuilder();
private List<String> sequence = new ArrayList<String>();
public BenzCarModel getBenzCarModel(){
sequence.clear();
sequence.add("start");
sequence.add("engine");
sequence.add("alarm");
sequence.add("stop");
benzBuilder.setSequence(sequence);
return (BenzCarModel)benzBuilder.getCarModel();
}
public BmwCarModel getBmwCarModel(){
sequence.clear();
sequence.add("start");
sequence.add("alarm");
sequence.add("engine");
sequence.add("stop");
bmwCarBuilder.setSequence(sequence);
return (BmwCarModel)bmwCarBuilder.getCarModel();
}
}
6、测试类
package com.java.builder;
public class BuilderTest {
public static void main(String[] args) {
Director director = new Director();
BenzCarModel benzCar = director.getBenzCarModel();
benzCar.run();
BmwCarModel bmwCar = director.getBmwCarModel();
bmwCar.run();
}
}
7、测试结果
奔驰车启动起来是这样子的...
奔驰车引擎启动是这样子的...
奔驰车喇叭声音是这样子的...
奔驰车停止是这样子的...
宝马车启动起来是这样子的...
宝马车喇叭声音是这样子的...
宝马车引擎启动是这样子的...
宝马车停止是这样子的...