建造者模式
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)建造者的定义省略,后面可能会补齐。
发表评论