建造者模式的定义:将一个复杂对象构建与它的表示分离,使得一样的构建过程能够建立不一样的表示java
建造者模式,保证了流程的肯定性,而流程内部的实现细节,是可继承扩展的。从根源上解决了流程不规范的问题。ide
建造者模式通用类图:ui
在建造者模式中有以下4个角色:this
建造者模式的优势:spa
建造者模式使用的场景:设计
实现一个建造者模式Demo,类图以下:3d
/** * @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; } }
具体产品类实现:code
/** * @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(); }
具体建造者实现:blog
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(); } }
建造者模式的注意事项:
建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大的不一样。虽然同为建立类模式,可是关注重点不同。