建造者模式
github:
【 https://github.com/cstriker1407/design_pattern 】
CONTENTS
1)将要制造的元素抽象出来,并将公用的业务封装在抽象类中。
/*
* 父类设计成抽象类,供子类来继承。 */ abstract class CarModel { private boolean bIsAlarm = false; /* start stop alarm 对外部调用者来讲不可见,可以设计为protected */ protected abstract void start(); protected abstract void stop(); protected abstract void alarm(); /* run 设置为final,可以将业务固化,防止子类重写 */ public final void run() { start(); if (isAlarm()) { alarm(); } stop(); } /* 所谓的钩子方法,子类可以实现,这样可以实现业务的可定制性。 */ private boolean isAlarm() { return bIsAlarm; } public final void setAlarm(boolean isAlarm) { this.bIsAlarm = isAlarm; } }
2)分别实例化两个具体的元素。
class ACar extends CarModel { @Override protected void start() { System.out.println("A Car Start"); } @Override protected void stop() { System.out.println("A Car Stop"); } @Override protected void alarm() { System.out.println("A Car Alarm"); } } class BCar extends CarModel { @Override protected void start() { System.out.println("B Car Start"); } @Override protected void stop() { System.out.println("B Car Stop"); } @Override protected void alarm() { System.out.println("B Car Alarm"); } }
3)为了方便制造,将制造类也抽象出来,屏蔽掉上层对元素的联系。
abstract class CarBuilder { public abstract void setAlarm(boolean isAlarm); public abstract CarModel getCar(); } class ACarBuilder extends CarBuilder { private ACar aCar = new ACar(); @Override public void setAlarm(boolean isAlarm) { aCar.setAlarm(isAlarm); } @Override public CarModel getCar() { return aCar; } } class BCarBuilder extends CarBuilder { private BCar bCar = new BCar(); @Override public void setAlarm(boolean isAlarm) { bCar.setAlarm(isAlarm); } @Override public CarModel getCar() { return bCar; } }
4)制造的控制类和测试代码。
class BuilderDirector { private ACarBuilder aCarBuilder = new ACarBuilder(); private BCarBuilder bCarBuilder = new BCarBuilder(); public ACar getACar() { aCarBuilder.setAlarm(true); return (ACar) aCarBuilder.getCar(); } public BCar getBCar() { bCarBuilder.setAlarm(false); return (BCar) bCarBuilder.getCar(); } } public class BuilderTest { public static void test() { BuilderDirector builderDirector = new BuilderDirector(); builderDirector.getACar().run(); builderDirector.getBCar().run(); } }
备注:
1)上述代码部分来自《 设计模式之禅 》
2)建造者的定义省略,后面可能会补齐。
发表评论