• 设计模式—建造者模式


    建造者模式:把工人(对象组件的建造者ComputerCreator)给主管(Director),让主管告诉工人如何一步一步创建产品。

          各司其职,主管知道该怎么创建对象,但是不会创建具体的对象模块。工人会创建具体的模块但是不知道给怎样一步一步创建。两者组合创建出需要的对象。

      优势:把复杂对象的各个模块的具体创建和各个模块的组合分隔开,封装创建过程,避免在创建过程出错。

         可以方便扩展同一类型的对象,只需添加一个Creator即可。

    示例说明:用IBM和Lenovo的员工创建出各自的电脑。

    类图如下:

    看代码:

    ComputerCreator:定义所有的员工技能

    复制代码
    package com.zpj.designMode.builderpattern;
    
    public interface ComputerCreator {
    
        public void createCPU();
        public void createMainboard();
        public void createHardDisk();
        public void createDisplay();
    }
    复制代码

    IBMCreator 具体员工的实现

    复制代码
    package com.zpj.designMode.builderpattern;
    
    public class IBMCreator implements ComputerCreator {
    //按照IBM的组件型号创建各个组件
        @Override
        public void createCPU() {
    
        }
    
        @Override
        public void createMainboard() {
    
        }
    
        @Override
        public void createHardDisk() {
    
        }
    
        @Override
        public void createDisplay() {
    
        }
    
    }
    复制代码

    LenovoCreator 具体员工的实现

    复制代码
    package com.zpj.designMode.builderpattern;
    
    public class LenovoCreator implements ComputerCreator {
    //按照Lenovo的组件型号创建各个组件
        @Override
        public void createCPU() {
    
        }
    
        @Override
        public void createMainboard() {
    
        }
    
        @Override
        public void createHardDisk() {
    
        }
    
        @Override
        public void createDisplay() {
    
        }
    
    }
    复制代码

    只有Director 才知道电脑创建流程,你给他工人,他来告诉工人怎么创建。

    复制代码
    package com.zpj.designMode.builderpattern;
    
    public class Director {
        private ComputerCreator creator;
    
        public Director(ComputerCreator creator) {
            super();
            this.creator = creator;
        }
    
        //只有Director才知道该如何建造电脑,执行创建顺序是什么,都需要那些步骤。
        //creator是不知道的,员工只会制作一个个组件,但是不知道创建一个电脑需要哪些组件以及创建顺序
        //所有电脑的制造流程是一样的,不一样的是电脑的各个组件型号不同
        public void createComputer() {
            creator.createCPU();
            creator.createDisplay();
            creator.createHardDisk();
            creator.createMainboard();
        }
    
    }
    复制代码

    测试类:

    复制代码
    package com.zpj.designMode.builderpattern;
    
    import org.junit.Test;
    
    public class BuilderPatternTest {
    
        @Test
        public void test01(){
            //给主管一个IBM的员工让主管告诉IBM的员工怎么创建一个IBM电脑
            Director IBMDirector = new Director(new IBMCreator());
            IBMDirector.createComputer();
            //给主管一个Lenovo的员工让主管告诉IBM的员工怎么创建一个IBM电脑
            Director lenovoDirector = new Director(new LenovoCreator());
            lenovoDirector.createComputer();
        }
    }
    复制代码

    此模式的目的就是为了避免创建复杂对象(对象需要由多个模块进行组合)出现问题,而把其创建过程封装起来,当使用的时候直接调用Director来进行创建,不需要调用处自行创建对象,减小错误的产生几率。

    同时又实现了同一类型不同属性对象的灵活扩充。例如可以随意扩展多个个TCLComputer、ASUSComputer,来实现不同类型的Computer创建。

  • 相关阅读:
    ELK+FileBeat 开源日志分析系统搭建-Centos7.8
    ORACLE转换时间戳方法(1546272000)
    由Swap故障引起的ORA-01034: ORACLE not available ORA-27102: out of memory 问题
    数据库设计规范
    数据库字段备注信息声明语法 CDL (Comment Declaration Language)
    渐进式可扩展数据库模型(Progressive Extensible Database Model, pedm)
    使用 ES6 的 Promise 对象和 Html5 的 Dialog 元素,模拟 JS 的 alert, confirm, prompt 方法的阻断执行功能。
    在sed中引入shell变量的四种方法
    参考文献中的[EB/OL]表示什么含义?
    优秀看图软件 XnViewMP v0.97.1 / XnView v2.49.4 Classic
  • 原文地址:https://www.cnblogs.com/zhangkeyu/p/6663864.html
Copyright © 2020-2023  润新知