修筑者模式
建造者模式Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一
建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
Builder模式的应用场景
- 对象的创建:Builder模式是为对象的创建而设计的模式
- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法
Builder模式的应用范例下面我们举个例子来加深我们对Builder模式的理解。
比如我们要通过一个汽车加工厂,组装一辆汽车;汽车由车头,车身,车尾3部分组成;它的基本组装步骤是:
- 组装车头
- 组装车身
- 组装车尾
不管被组装的是吉普车,卡车,还是公交车,它们都可以各自重新定义车头,车身与车尾的组装方法;而通过这些被重新定义的组装方法,通过相同的组装步骤就可以组装具有不同属性的各类汽车了。
通过上面的分析,我们知道,该范例满足Builder模式的应用场景所提到的条件:
- 对象的创建:我们需要创建汽车对象
- 创建的是一个复合对象:我们需要创建的汽车对象是具有车头,车身,车尾等复合属性的复合对象
- 关注对象创建的各部分的创建过程:吉普车,卡车等对车头,车身,车尾的组装方法不尽相同
下面我们用Builder设计模式来抽象以上组装过程:
- CarDirector:汽车组装操作的封装类
- CarBuilder:汽车组装抽象类
- JeepBuilder:吉普车组装类,继承自CarBuilder类。
- Car:汽车类,包括车头,车身,车尾等属性。相当于产品类。由CarBuilder/JeepBuilder等创建。
源代码
- //汽车类??
- public?class?Car?{??
- ????//车头??
- ????private?String?head;??
- ????//车身??
- ????private?String?body;??
- ????//车尾??
- ????private?String?tail;??
- ??
- ????public?String?getBody()?{??
- ????????return?body;??
- ????}??
- ????public?void?setBody(String?body)?{??
- ????????this.body?=?body;??
- ????}??
- ????public?String?getHead()?{??
- ????????return?head;??
- ????}??
- ????public?void?setHead(String?head)?{??
- ????????this.head?=?head;??
- ????}??
- ????public?String?getTail()?{??
- ????????return?tail;??
- ????}??
- ????public?void?setTail(String?tail)?{??
- ????????this.tail?=?tail;??
- ????}??
- }??
- ??
- ??
- //汽车组装抽象类??
- public?abstract?class?CarBuilder?{??
- ????//组装车头??
- ????public?abstract?void?makeHead();??
- ????//组装车身??
- ????public?abstract?void?makeBody();??
- ????//组装车尾??
- ????public?abstract?void?makeTail();??
- ????//得到被组装好的汽车对象??
- ????public?abstract?Car?getCar();??
- }??
- ??
- //吉普车组装类??
- public?class?JeepBuilder?extends?CarBuilder?{??
- ????Car?car?=?new?Car();??
- ??
- ????//组装车头??
- ????public?void?makeHead()?{??
- ????????car.setHead("Jeep?head");??
- ????}??
- ????//组装车身??
- ????public?void?makeBody()?{??
- ????????car.setHead("Jeep?body");??
- ????}??
- ????//组装车尾??
- ????public?void?makeTail()?{??
- ????????car.setHead("Jeep?tail");??
- ????}??
- ??
- ????public?Car?getCar()?{??
- ????????return?car;??
- ????}??
- }??
- ??
- ??
- //汽车组装操作的封装类:该类封装了对整个汽车的组装操作??
- public?class?CarDirector?{??
- ????//汽车的组装操作??
- ????public?void?makeCar(CarBuilder?builder)?{??
- ????????//组装车头??
- ????????builder.makeHead();??
- ????????//组装车身??
- ????????builder.makeBody();??
- ????????//组装车尾??
- ????????builder.makeTail();??
- ????}??
- }??
- ??
- //调用??
- public?class?Client?{??
- ????public?static?void?main(String[]?args)?{??
- ????????CarDirector?director?=?new?CarDirector();??
- ??
- ????????//创建吉普车生成器(工厂)??
- ????????CarBuilder?b?=?new?JeepBuilder();??
- ????????//调用CarDirector组装整个汽车??
- ????????director.makeCar(b);??
- ??
- ????????//得到组装好的汽车??
- ????????Car?car?=?b.getCar();??
- ????????System.out.println(car.getHead());??
- ????????System.out.println(car.getBody());??
- ????????System.out.println(car.getTail());??
- ????}??
- }?
上面演示了吉普车(Jeep)的生产过程,如果需要创建公交车(Bus),我们可以依葫芦画瓢,使用一个继承自CarBuilder的BusBuilder,便可简单地生产一个具有与吉普车不同的车头,车身,车尾的汽车来。