【2013-10-17】设计模式学习笔记:建造者模式

【2013-10-17】设计模式学习笔记:建造者模式

[历史归档]本文原发布于 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();}}

备注

  1. 上述代码部分来自《设计模式之禅》
  2. 建造者模式定义后续补充