设计模式学习之建造者模式
建造者模式的定义:将一个复杂对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示
建造者模式,保证了流程的确定性,而流程内部的实现细节,是可继承扩展的。从根源上解决了流程不规范的问题。
建造者模式通用类图:
在建造者模式中有如下4个角色:
- Product产品类:通常是实现了模版方法模式也就是有模版方法和基本方法
- Builder抽象建造者:规范产品的组建,一般是由子类实现
- ConcreteBuilder具体的建造者:实现抽象类定义的所以方法,并且返回一个组建好的对象。
- Director导演类:负责安排已有模块的顺序,告诉Builder开始建造
建造者模式的优点:
- 封装性
- 建造者独立,容易扩展
- 便于控制细节风险
建造者模式使用的场景:
- 相同的方法,不同的执行顺序,产生不同的时间结果
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同
- 产品类非常复杂
实现一个建造者模式Demo,类图如下:
/** * @author Lin * @Date 2018/1/5. */ public abstract class CarModel { /** * 这个参数是各个基本方法的执行顺序 */ private ArrayList<String> sequences = new ArrayList<>(); /** * 启动 */ protected abstract void start(); /** * 停止 */ protected abstract void stop(); /** * 按喇叭 */ protected abstract void alarm(); /** * 发动机响声 */ protected abstract void engineBoom(); /** * 按照不同的设定运行 */ final public void run(){ for (String sequence : sequences){ if(sequence.equals("start")){ this.start(); }else if(sequence.equals("stop")){ this.stop(); }else if(sequence.equals("alarm")){ this.alarm(); }else if(sequence.equals("engine")){ this.engineBoom(); } } } final public void setSequences(ArrayList<String> sequences){ this.sequences = sequences; } }
具体产品类实现:
/** * @author Lin * @Date 2018/1/5. */ public class BenzModel extends CarModel{ @Override protected void start() { System.out.println("奔驰车启动..."); } @Override protected void stop() { System.out.println("奔驰车停车..."); } @Override protected void alarm() { System.out.println("奔驰车按喇叭...."); } @Override protected void engineBoom() { System.out.println("奔驰车引擎是这个声音的...."); } } /** * @author Lin * @Date 2018/1/5. */ public class BMWModel extends CarModel{ @Override protected void start() { System.out.println("宝马车启动..."); } @Override protected void stop() { System.out.println("宝马车停车..."); } @Override protected void alarm() { System.out.println("宝马车按喇叭...."); } @Override protected void engineBoom() { System.out.println("宝马车引擎是这个声音的...."); } }
抽象建造者:
import java.util.ArrayList; /** * @author Lin * @Date 2018/1/5. */ public abstract class CarBuilder { /** * 设计启动顺序 * @param sequences */ public abstract void setSequences(ArrayList<String> sequences); /** * 设置完成后,获取车辆 * @return */ public abstract CarModel getCarModel(); }
具体建造者实现:
import java.util.ArrayList; /** * @author Lin * @Date 2018/1/5. */ public class BenzBuilder extends CarBuilder{ private BenzModel benz = new BenzModel(); @Override public void setSequences(ArrayList<String> sequences) { benz.setSequences(sequences); } @Override public CarModel getCarModel() { return benz; } } import java.util.ArrayList; /** * @author Lin * @Date 2018/1/5. */ public class BMWBuilder extends CarBuilder{ private BMWModel bmw = new BMWModel(); @Override public void setSequences(ArrayList<String> sequences) { bmw.setSequences(sequences); } @Override public CarModel getCarModel() { return bmw; } }
导演类:
import java.util.ArrayList; /** * @author Lin * @Date 2018/1/5. */ public class Client { public static void main(String[] args) { ArrayList<String> benzSequences = new ArrayList<>(); benzSequences.add("engine"); benzSequences.add("start"); benzSequences.add("alarm"); benzSequences.add("stop"); BenzBuilder benzBuilder = new BenzBuilder(); benzBuilder.setSequences(benzSequences); BenzModel benz = (BenzModel) benzBuilder.getCarModel(); benz.run(); ArrayList<String> bmwSequences = new ArrayList<>(); bmwSequences.add("start"); bmwSequences.add("engine"); bmwSequences.add("alarm"); bmwSequences.add("stop"); BMWBuilder bmwBuilder = new BMWBuilder(); bmwBuilder.setSequences(bmwSequences); BMWModel bmw = (BMWModel)bmwBuilder.getCarModel(); bmw.run(); } }
建造者模式的注意事项:
建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大的不同。虽然同为创建类模式,但是关注重点不一样。