建造者模式
定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
代码
比如现在要造不同的车子,车子的动作顺序可以自己定义,从而生成不同的车子
首先定义车子
public abstract class Car {
private List<String> sequence = new ArrayList<>();
public abstract void start();
public abstract void stop();
public abstract void alarm();
final public void run(){
for (String action : sequence) {
if(action.equalsIgnoreCase("start")){
this.start();
}else if(action.equalsIgnoreCase("stop")){
this.stop();
}else if(action.equalsIgnoreCase("alarm")){
this.alarm();
}
}
}
final public void setSequence(List<String> sequence) {
this.sequence = sequence;
}
}
上面定义了一个车子的模板,使用sequence来控制车子的动作顺序,下面定义实现类
public class CarA extends Car {
@Override
public void start() {
System.out.println("car A start");
}
@Override
public void stop() {
System.out.println("car A stop");
}
@Override
public void alarm() {
System.out.println("car A alarm");
}
}
public class CarB extends Car {
@Override
public void start() {
System.out.println("car B start");
}
@Override
public void stop() {
System.out.println("car B stop");
}
@Override
public void alarm() {
System.out.println("car B alarm");
}
}
现在车子有了,既然要造车子,现在定义建造者
public abstract class CarBuilder {
//执行顺序
public abstract void setSequence(List<String> sequence);
//返回对象
public abstract Car getCar();
}
public class CarABuilder extends CarBuilder {
private Car carA = new CarA();
@Override
public void setSequence(List<String> sequence) {
this.carA.setSequence(sequence);
}
@Override
public Car getCar() {
return this.carA;
}
}
public class CarBBuilder extends CarBuilder {
private Car carB = new CarB();
@Override
public void setSequence(List<String> sequence) {
this.carB.setSequence(sequence);
}
@Override
public Car getCar() {
return this.carB;
}
}
上面首先定义了建造者,需要传入顺序,然后返回对应的车子,现在只需要一个导演类来实现具体车子的顺序制造
public class Director {
private List<String> sequence = new ArrayList<>();
private CarBuilder aBuilder = new CarABuilder();
private CarBuilder bBuilder = new CarBBuilder();
public Car getCarA(){
this.sequence.clear();
this.sequence.add("stop");
this.sequence.add("alarm");
this.sequence.add("start");
this.aBuilder.setSequence(this.sequence);
return this.aBuilder.getCar();
}
public Car getCarB(){
this.sequence.clear();
this.sequence.add("alarm");
this.sequence.add("stop");
this.sequence.add("start");
this.bBuilder.setSequence(this.sequence);
return this.bBuilder.getCar();
}
//...其他类型(顺序)的CarA CarB
}
测试:
public void testBuilder(){
Director director = new Director();
director.getCarA().run();
director.getCarB().run();
}