• 建造者模式【构建模式】


    建造者模式

    Separate the construction of a complex object from its representation so that
    the same construction process can create different representations.
    将一个复杂对象的构建与其表示分离,以便相同的构建过程可以创建不同的表示。
    
    public class Constuctor {
        /**
         * 建造者模式:
         * Separate the construction of a complex object from its representation so that
         * the same construction process can create different representations.
         * 将一个复杂对象的构建与其表示分离,以便相同的构建过程可以创建不同的表示。
         */
    
        @Test
        public void all() {
            BenzFactory.series1().run();
            BenzFactory.series2().run();
        }
    }
    
    /**
     * 1)定义零件类型
     */
    enum CarPartEnum {
        ENGINE, ALARM, VEHICLE_MOUNTED_SYSTEM, BRAKE;
    }
    
    /**
     * 2)定义零件操作
     */
    interface CarPart {
        String name();
    
        void doWork();
    }
    
    /**
     * 3)定义具体的零件
     */
    @Builder
    @Slf4j
    class CarPartImpl implements CarPart {
        private final String name;
    
        @Override
        public void doWork() {
            log.info("{} is working now", name);
        }
    
        @Override
        public String name() {
            return name;
        }
    }
    
    /**
     * 4)整合零件与操作的模型类,核心组件
     */
    class CarModel {
        private final List<CarPart> parts = Lists.newArrayList();
    
        public CarModel addPart(CarPart carPart) {
            parts.add(carPart);
            return this;
        }
    
        public final void run() {
            parts.forEach(CarPart::doWork);
        }
    }
    
    /**
     * 5)抽象建造者
     */
    interface CarBuilder {
        CarModel build();
    }
    
    /**
     * 6)具体建造者
     */
    class BenzSeries1CarBuilder implements CarBuilder {
        private static final CarBuilder CAR_BUILDER = new BenzSeries1CarBuilder();
    
        private BenzSeries1CarBuilder() {
        }
    
        public static CarBuilder get() {
            return CAR_BUILDER;
        }
    
        @Override
        public CarModel build() {
            return new CarModel()
                    .addPart(new CarPartImpl(CarPartEnum.ENGINE.name()))
                    .addPart(new CarPartImpl(CarPartEnum.BRAKE.name()));
        }
    }
    
    class BenzSeries2CarBuilder implements CarBuilder {
        private static final CarBuilder CAR_BUILDER = new BenzSeries2CarBuilder();
    
        private BenzSeries2CarBuilder() {
        }
    
        public static CarBuilder get() {
            return CAR_BUILDER;
        }
    
        @Override
        public CarModel build() {
            return new CarModel()
                    .addPart(new CarPartImpl(CarPartEnum.ENGINE.name()))
                    .addPart(new CarPartImpl(CarPartEnum.VEHICLE_MOUNTED_SYSTEM.name()))
                    .addPart(new CarPartImpl(CarPartEnum.ALARM.name()))
                    .addPart(new CarPartImpl(CarPartEnum.BRAKE.name()));
        }
    }
    
    /**
     *  7)实例工厂
     */
    class BenzFactory {
        public static CarModel series1() {
            return BenzSeries1CarBuilder.get().build();
        }
    
        public static CarModel series2() {
            return BenzSeries2CarBuilder.get().build();
        }
    }
    
  • 相关阅读:
    kendoGrid edit功能
    kendoGrid Event事件
    你不得不看的81条JavaScript编码小技巧,吐血整理,建议收藏
    H265编码视频流媒体播放器EasyPlayer.js支持9宫格视频同屏播放的写法
    EasyNTS 交叉编译海思系统下的可执行程序实现及测试过程
    EasyNTS在Go1.15版本下linux下无法编译的问题优化
    TSINGSEE青犀视频开发Python3行人分析功能运行一段时间后崩溃是什么原因?
    Mysql数据库导入excel和乱码问题
    聊聊5G:5G技术的落地能给视频娱乐、VR直播带来怎样的潜力?
    企业直播的核心点在哪里?未来将如何发展?
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10163853.html
Copyright © 2020-2023  润新知