[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2013-10-17| 标题:设计模式学习笔记:建造者模式|分类:编程 / 设计模式 / java |标签:设计模式·java·建造者模式
设计模式学习笔记:建造者模式
- 1. 将要制造的元素抽象出来,将公用业务封装在抽象类中
- 2. 分别实例化两个具体的元素
- 3. 将制造类抽象出来,屏蔽上层对具体元素的依赖
- 4. 控制类与测试代码
- 备注
建造者模式(Builder Pattern)将复杂对象的构建过程与其表示分离,使同样的构建流程可以创建不同的产品。
示例代码:https://github.com/cstriker1407/design_pattern
1. 将要制造的元素抽象出来,将公用业务封装在抽象类中
/** * 父类设计成抽象类,供子类继承。 */abstractclassCarModel{privatebooleanbIsAlarm=false;// start/stop/alarm 对外不可见,设计为 protectedprotectedabstractvoidstart();protectedabstractvoidstop();protectedabstractvoidalarm();// run 设置为 final,固化业务流程,防止子类重写publicfinalvoidrun(){start();if(isAlarm()){alarm();}stop();}// 钩子方法:子类可通过 setAlarm 控制是否触发 alarmprivatebooleanisAlarm(){returnbIsAlarm;}publicfinalvoidsetAlarm(booleanisAlarm){this.bIsAlarm=isAlarm;}}2. 分别实例化两个具体的元素
classACarextendsCarModel{@Overrideprotectedvoidstart(){System.out.println("A Car Start");}@Overrideprotectedvoidstop(){System.out.println("A Car Stop");}@Overrideprotectedvoidalarm(){System.out.println("A Car Alarm");}}classBCarextendsCarModel{@Overrideprotectedvoidstart(){System.out.println("B Car Start");}@Overrideprotectedvoidstop(){System.out.println("B Car Stop");}@Overrideprotectedvoidalarm(){System.out.println("B Car Alarm");}}3. 将制造类抽象出来,屏蔽上层对具体元素的依赖
abstractclassCarBuilder{publicabstractvoidsetAlarm(booleanisAlarm);publicabstractCarModelgetCar();}classACarBuilderextendsCarBuilder{privateACaraCar=newACar();@OverridepublicvoidsetAlarm(booleanisAlarm){aCar.setAlarm(isAlarm);}@OverridepublicCarModelgetCar(){returnaCar;}}classBCarBuilderextendsCarBuilder{privateBCarbCar=newBCar();@OverridepublicvoidsetAlarm(booleanisAlarm){bCar.setAlarm(isAlarm);}@OverridepublicCarModelgetCar(){returnbCar;}}4. 控制类与测试代码
classBuilderDirector{privateACarBuilderaCarBuilder=newACarBuilder();privateBCarBuilderbCarBuilder=newBCarBuilder();publicACargetACar(){aCarBuilder.setAlarm(true);return(ACar)aCarBuilder.getCar();}publicBCargetBCar(){bCarBuilder.setAlarm(false);return(BCar)bCarBuilder.getCar();}}publicclassBuilderTest{publicstaticvoidtest(){BuilderDirectordirector=newBuilderDirector();director.getACar().run();director.getBCar().run();}}备注
- 上述代码部分来自《设计模式之禅》
- 建造者模式定义后续补充