好记性不如铅笔头

java, 编程, 设计模式

设计模式学习笔记:建造者模式

建造者模式

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

发表评论

13 + 19 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据