建造者模式
1、已车辆模型为例,客户要求,车辆要求先启动、再鸣笛、再停止。
分析:需要有个抽象车模吧,还要有具体车辆的实现类吧。编写测试类就能完成这一需求
package gov.mof.fasp2.gcfr.adjustoffset.adjust; import java.util.ArrayList; /** * 车模抽象类 * @author haokui * */ abstract class CarModel { //存放执行顺序 private ArrayList<String> seq = new ArrayList<String>(); //启动 abstract void start(); //停止 abstract void stop(); //鸣笛 abstract void alarm(); void run() { for (String str : seq) { if ("start".equals(str)) { this.start(); continue; } if ("stop".equals(str)) { this.stop(); continue; } if ("alarm".equals(str)) { this.alarm(); continue; } } } //设置顺序 public void setSeq(ArrayList<String> seq) { this.seq = seq; } } /** * 奔驰模型 * @author haokui * */ class BenzModel extends CarModel{ @Override void start() { System.out.println("奔驰启动。。。"); } @Override void stop() { System.out.println("奔驰停止。。。"); } @Override void alarm() { System.out.println("奔驰鸣笛。。。"); } } /** * 宝马模型 * @author haokui * */ class BMWModel extends CarModel{ @Override void start() { System.out.println("宝马启动。。。"); } @Override void stop() { System.out.println("宝马停止。。。"); } @Override void alarm() { System.out.println("宝马鸣笛。。。"); } } /** * 测试场景类 * @author haokui * */ public class Main { public static void main(String[] args) { BMWModel bmw = new BMWModel(); ArrayList<String> seq = new ArrayList<String>(); seq.add("start"); seq.add("alarm"); seq.add("stop"); bmw.setSeq(seq); bmw.run(); } }
运行结果:
宝马启动。。。
宝马鸣笛。。。
宝马停止。。。
2、刚把这个写完,客户又说了,不想要这样的了,要求可以自己设置顺序,不一定是刚才的顺序。完了,傻脸了。得想办法满足客户需求啊,所以下面就是要用建造者模式去满足客户的需求。
分析:抽象车模还是要有。但是给车辆模型建一个抽象建造者,宝马和奔驰各自编写一个建造者来实现车模建造者,他的作用就是设置宝马或者奔驰传递过来的顺序,和返回一个具体的车辆模型。
package gov.mof.fasp2.gcfr.adjustoffset.adjust; import java.util.ArrayList; /** * 车模抽象类 * @author haokui * */ abstract class CarModel { //存放执行顺序 private ArrayList<String> seq = new ArrayList<String>(); //启动 abstract void start(); //停止 abstract void stop(); //鸣笛 abstract void alarm(); void run() { for (String str : seq) { if ("start".equals(str)) { this.start(); continue; } if ("stop".equals(str)) { this.stop(); continue; } if ("alarm".equals(str)) { this.alarm(); continue; } } } //设置顺序 public void setSeq(ArrayList<String> seq) { this.seq = seq; } } /** * 奔驰模型 * @author haokui * */ class BenzModel extends CarModel{ @Override void start() { System.out.println("奔驰启动。。。"); } @Override void stop() { System.out.println("奔驰停止。。。"); } @Override void alarm() { System.out.println("奔驰鸣笛。。。"); } } /** * 宝马模型 * @author haokui * */ class BMWModel extends CarModel{ @Override void start() { System.out.println("宝马启动。。。"); } @Override void stop() { System.out.println("宝马停止。。。"); } @Override void alarm() { System.out.println("宝马鸣笛。。。"); } } /** * 车辆模型建造者 * @author haokui * */ abstract class CarBuild { //返回车模 public abstract CarModel getCarModel(); //设置传递过来的顺序 public abstract void setSeq(ArrayList<String> seq); } /** * 奔驰模型建造者 * @author haokui * */ class BenzBuild extends CarBuild { BenzModel b = new BenzModel(); @Override public CarModel getCarModel() { return b; } @Override public void setSeq(ArrayList<String> seq) { this.b.setSeq(seq); } } /** * 宝马模型建造者 * @author haokui * */ class BMWBuild extends CarBuild { BMWModel b = new BMWModel(); @Override public CarModel getCarModel() { return b; } @Override public void setSeq(ArrayList<String> seq) { this.b.setSeq(seq); } } /** * 测试场景类 * @author haokui * */ public class Main { public static void main(String[] args) { //定义一个顺序 ArrayList<String> seq = new ArrayList<String>(); seq.add("start"); seq.add("alarm"); seq.add("stop"); //创建奔驰建造者 BenzBuild b = new BenzBuild(); b.setSeq(seq); BenzModel benz = (BenzModel) b.getCarModel(); benz.run(); //按照同样的顺序,再要一个宝马 BMWBuild bmw = new BMWBuild(); bmw.setSeq(seq); BMWModel bmwmodel = (BMWModel) bmw.getCarModel(); bmwmodel.run(); } }
运行结果:
奔驰启动。。。
奔驰鸣笛。。。
奔驰停止。。。
宝马启动。。。
宝马鸣笛。。。
宝马停止。。。
同理,再要一个奥迪也是一样,这样的话就不要直接去访问产品类了,直接把顺序传递给建造者,然后获取车模,拿到模型,再去运行,代码会简便很多。