• 建造者(Builder)模式


    在学习MyBatis的过程中遇到了建造者(Builder)模式,查找了相关资料,在这做下记录加深印象。

    参考资料:

    1. java设计模式-建造者模式(Builder)
    2. 人人都会设计模式---建造者模式--Builder
    3. 《JAVA与模式》之建造模式

    1.什么是建造者模式

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,通俗的说就是:建造者模式就是如何一步步构建一个包含多个组成部件的对象,相同的构建过程可以创建不同的产品。

    2.一个组装电脑的示例

    小明想组装一个台式电脑,小明对电脑配置一窍不通,就直接跑到电脑城给装机老板说我要一台打游戏非常爽的电脑,麻烦你给装一下「配置什么的你给我推荐一下吧」,于是老板就让它的员工「小美」按小明的要求装了一个性能灰常牛 B 的电脑,1 个小时后电脑装好了,小明交钱拿电脑走人。不一会儿小张又来了,要一个满足平时写文章就可以的电脑,老板针对小张的要求给不同的装机配置。不同的人有不同的配置方案「但是装机流程是一样的」,这就是一个典型的建造者模式。

    2.1创建被建造的电脑对象-----Computer.java

     1 package club.nipengfei.demo02;
     2 
     3 /**
     4  * 产品类--被建造的对象
     5  */
     6 public class Computer {
     7     private String cpu ; // cpu
     8     private String hardDisk ; //硬盘
     9     private String mainBoard ; // 主板
    10     private String memory ; // 内存
    11 
    12     public String getCpu() {
    13         return cpu;
    14     }
    15 
    16     public void setCpu(String cpu) {
    17         this.cpu = cpu;
    18     }
    19 
    20     public String getHardDisk() {
    21         return hardDisk;
    22     }
    23 
    24     public void setHardDisk(String hardDisk) {
    25         this.hardDisk = hardDisk;
    26     }
    27 
    28     public String getMainBoard() {
    29         return mainBoard;
    30     }
    31 
    32     public void setMainBoard(String mainBoard) {
    33         this.mainBoard = mainBoard;
    34     }
    35 
    36     public String getMemory() {
    37         return memory;
    38     }
    39 
    40     public void setMemory(String memory) {
    41         this.memory = memory;
    42     }
    43 }

    2.2抽象的建造者-----Builder.java

     1 package club.nipengfei.demo02;
     2 
     3 /**
     4  * 抽象的建造者,即装电脑的步骤
     5  * 至于安装什么型号的主板,不是我关心,而是具体的建造者关心的
     6  */
     7 public interface Builder {
     8     // 安装主板
     9     void createMainBoard(String mainBoard) ;
    10     // 安装 cpu
    11     void createCpu(String cpu) ;
    12     // 安装硬盘
    13     void createhardDisk(String hardDisk) ;
    14     // 安装内存
    15     void createMemory(String memory) ;
    16     // 组成电脑
    17     Computer createComputer() ;
    18 }

    2.3具体建造者,也就是装机工人小美 -----AssemblerBuilder.java

     1 package club.nipengfei.demo02;
     2 
     3 public class AssemblerBuilder implements Builder {
     4     Computer computer = new Computer();
     5     @Override
     6     public void createMainBoard(String mainBoard) {
     7         computer.setMainBoard(mainBoard);
     8     }
     9 
    10     @Override
    11     public void createCpu(String cpu) {
    12         computer.setCpu(cpu);
    13     }
    14 
    15     @Override
    16     public void createhardDisk(String hardDisk) {
    17         computer.setHardDisk(hardDisk);
    18     }
    19 
    20     @Override
    21     public void createMemory(String memory) {
    22         computer.setMemory(memory);
    23     }
    24 
    25     @Override
    26     public Computer createComputer() {
    27         return computer;
    28     }
    29 }

    2.4还有老板安排装机工工作

    package club.nipengfei.demo02;
    
    /**
     * 声明一个导演类「指挥者,这里可以装电脑的老板」,用来指挥组装过程,也就是组装电脑的流程
     */
    public class Director {
        private Builder builder;
        // 使用多态,装机工很多,老板可以指挥各个装几个
        public Director(Builder builder){
            this.builder = builder;
        }
        // 老板最后只想获得装成的成品
        public Computer createComputer(String cpu,String hardDisk,String mainBoard,String memory){
            // 具体工作是装机工去做
            this.builder.createMainBoard(mainBoard);
            this.builder.createCpu(cpu);
            this.builder.createMemory(memory);
            this.builder.createhardDisk(hardDisk);
            return this.builder.createComputer();
        }
    }

    2.5测试类----Test.java

     1 package club.nipengfei.demo02;
     2 
     3 public class Test {
     4     public static void main(String[] args) {
     5         // 装机员小美
     6         Builder builder = new AssemblerBuilder();
     7         // 老板把小明的需求转给小美
     8         Director director = new Director(builder);
     9         // 老板最后拿到成品电脑,工作小美去做
    10         Computer computer = director.createComputer("Intel 酷睿i9 7900X","三星M9T 2TB (HN-M201RAD)","技嘉AORUS Z270X-Gaming 7","科赋Cras II 红灯 16GB DDR4 3000");
    11         System.out.println("小明使用的电脑是:
    "+computer.getMainBoard()+"主板
    "+computer.getCpu()+"CPU
    "+computer.getHardDisk()+"硬盘
    "+computer.getMemory()+"内存
    ");
    12     }
    13 }

    2.6运行测试类结果

    1 小明使用的电脑是:
    2 技嘉AORUS Z270X-Gaming 7主板
    3 Intel 酷睿i9 7900XCPU
    4 三星M9T 2TB (HN-M201RAD)硬盘
    5 科赋Cras II 红灯 16GB DDR4 3000内存

    3.建造者模式的特点

    建造者模式是一种创建型模式,适用于那些流程固定「顺序不一定固定」,建造的目标对象会有所改变这种场景「比如画一条狗,这个目标不变,但是不同的是有黄狗,胖狗,瘦狗等」。上面的示例中安装电脑的流程是固定的,建造的目标对象会改变,Computer.java的对象不同,可以有不同的主板,CPU,硬盘,内存。

    4.建造者模式的作用

    1. 用户不知道对象的建造过程和细节就可以创建出复杂的对象「屏蔽了建造的具体细节」。在测试类中直接使用Director类的createComputer方法创建出computer对象。
    2. 用户只需给出复杂对象的内容和类型可以创建出对象。将参数给Director类对象。
    3. 建造者模式按流程一步步的创建出复杂对象。流程在Director.java中的createComputer方法,具体工作有装机工完成。

    5.建造者模式的优缺点

    • 优点
      1. 使创建产品的步骤「把创建产品步骤放在不同的方法中(AssemblerBuilder.java中的各个方法),更加清晰直观」和产品本身分离,即使用相同的创建过程创建出不同的产品。
      2. 每个建造者都是独立的互不影响,这样就达到解耦的目的,所以如果想要替换现有的建造者那非常方便,添加一个实现即可。
    • 缺点
      1. 只适用于产品具有相同的特点「过程和步骤」,如果产品之间差异非常大,则不适用「使用范围受限」
      2. 万一那天产品内部发生改变,那多个建造者都要修改,成本太大

    6.建造者模式的使用场景

    1. 如果一个对象有非常复杂的内部结构「这些产品通常有很多属性」,那么使用建造者模式
    2. 如果想把复杂对象的创建和使用分离开来,那么使用建造者模式「使用相同的创建步骤可以创建不同的产品」
  • 相关阅读:
    Windows 2003/2008更改远程桌面端口脚本
    如何修改远程桌面连接3389端口
    关于百度地图(离线)使用过程报“Cannot read property 'jb' of undefined ”错误的解决办法
    IIS 错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
    IIS 错误:由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
    IIS7错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny")......
    Jqgrid pager 关于“local” dataType 动态加载数据分页的研究(没好用的研究结果)
    JQGrid导出Excel文件
    Oracle以15分钟为界,统计一天内各时间段的数据笔数
    ORA-01438: 值大于为此列指定的允许精度
  • 原文地址:https://www.cnblogs.com/qzwl/p/11805954.html
Copyright © 2020-2023  润新知