设计模式-建造者模式
建造者模式,本文讲了注意事项,使用环境,定义等多种情况.
1. 定义
将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示;
其中有四种角色
Product 产品
通常是实现了模板方法模式,也就是有模板方法和基本方法,
Builder 抽象建造者
规范产品的重组,一般由子类完成
ConcreteBuilder具体建造者
实现抽象类定义的所有方法,并且返回一个好的对象.
Director 导演类
负责安排已有模块的顺序,然后开始告诉builder 建造
1.2 建造类的基本代码
1.2.1 product 产品
1 public class Product(){ 2 3 public void doSomething(){ 4 //具体什么事情 5 } 6 }
1.2.2 抽象建造类
1 public abstract class Builder { 2 //设置不同产品的不同部分 3 public abstract void setPart(); 4 //建造产品 5 public abstract Product buildProduct(); 6 }
1.2.3 具体建造者
1 public class ConcreateProduct extends Buidlder{ 2 private Product pro = new Product(); 3 4 //设置产品步骤,细节 5 public void setPart(){ 6 //产品类的逻辑处理 7 } 8 9 //组建一个产品 10 public Product builidProduct(){ 11 return product; 12 } 13 }
1.2.4 导演类
起到封装的作用,避免高层模块深入到建造者内部的实现类中.当然如果建造类模式比较庞大时,导演类可以有多个.
1 public class Director{ 2 private Builder builder = new ConcreateBuilder(); 3 4 //构建不同的产品 5 public Product getProductA(){ 6 builder.setPart(); 7 return builder.builidProduct(); 8 } 9 }
2 . 具体例子
这里其实我们也使用了 "模板方法"模式的,有兴趣的朋友可以看下我上个 ::设计模式-模板方法模式的实现的
2.1 产品类
public abstract class CarModel { //各方法执行的顺序 private ArrayList<String>seqList = new ArrayList<>(); //启动 protected abstract void start(); //鸣笛 protected abstract void didi() ; //跑起来 protected abstract void run(); //停止 protected abstract void stop(); //模板方法 final public void exc(){ //循环判断执行顺序 for (String seq : seqList) { if (seq.equalsIgnoreCase("start")) { start(); }else if (seq.equalsIgnoreCase("didi")) { didi(); }else if (seq.equalsIgnoreCase("run")) { run(); }else if (seq.equalsIgnoreCase("stop")) { stop(); } } } //设置seqList值 public final void setSeqList(ArrayList<String> seqList){ this.seqList = seqList; } }
//具体产品实现类 public class BenzModel extends CarModel { // 启动 protected void start() { System.out.println("奔驰启动"); } // 鸣笛 protected void didi() { System.out.println("奔驰鸣笛"); } // 跑起来 protected void run() { System.out.println("奔驰跑起来"); } // 停止 protected void stop() { System.out.println("奔驰停下来"); } }
//测试类
public class Test { public static void main(String[] args) { BenzModel benz = new BenzModel(); ArrayList<String>list = new ArrayList<>(); list.add("start"); list.add("didi"); list.add("stop"); benz.setSeqList(list); benz.exc(); } }
以上主要是模板设计模式的使用.现在根据需求改装
// 1. 抽象汽车组装者
public abstract class CarBuilder { //建造一个模型 public abstract void setSeqList(ArrayList<String> seqList); //模型完成后,就可以直接拿到这个模型 public abstract CarModel getCarModel(); }
/2 .具体的组装者
public class BenzBuilder extends CarBuilder{ private BenzModel benzModel = new BenzModel(); public void setSeqList(ArrayList<String> seqList) { this.benzModel.setSeqList(seqList); } public CarModel getCarModel() { return this.benzModel; } }
3.要一个奔驰车
public class Cilent { public static void main(String[] args) { /** * 设置一个顺序List */ ArrayList<String>seqList = new ArrayList<>(); seqList.add("start"); seqList.add("didi"); seqList.add("stop"); //要一个奔驰车 BenzBuilder benzBuilder = new BenzBuilder(); benzBuilder.setSeqList(seqList); BenzModel benzModel = (BenzModel) benzBuilder.getCarModel(); benzModel.exc(); } }
4.导演类
public class Director { ArrayList<String> seqList = new ArrayList<>(); // 这里可以有多个,具体的创建类 BenzBuilder benzBuilder = new BenzBuilder(); // A种奔驰 public BenzModel getABenz() { seqList.clear(); seqList.add("start"); seqList.add("end"); benzBuilder.setSeqList(seqList); return (BenzModel) benzBuilder.getCarModel(); } // B种奔驰 public BenzModel getBBenz() { seqList.clear(); seqList.add("start"); seqList.add("didi"); seqList.add("end"); benzBuilder.setSeqList(seqList); return (BenzModel) benzBuilder.getCarModel(); } }
这样确定了完成细节,就能呢个直接获得某种产品了.
3.建造者的应用
3.1 建造者的优点
1.封装性,全部都封装得特别好
2.独立性,扩展性,需要扩展了就直接添加一个品种就行
3.便于控制细节风险控制
3.2 使用场景
1.相同的的方法,不同的执行顺序,产生不同的结果
2.多个部件和零件,都可以装配到一个对象中去,但是产生的结果又不相同
3.产品类特别复杂,或者产品类中的调用顺序 不同产生了不同的效能,
4.在建造者模式中使用到系统的一些其他对象,这些对象在创建过程中不易得到时,也可以采用才模式封装创建过程.这样只是一个补偿方法.
3.3 和工厂模式的不同
看着很像,但是确非常不同,这个我们在后面的工厂模式中再细细讲解吧
3.4 使用的时候一定要注意 "模板设计"模式,两个搭配起来用,这个是非常重要的