zoukankan      html  css  js  c++  java
  • 设计模式

    1.使用场景

    当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

    2.最佳实现:建造者模式

    例如我们现在有如下一个类计算机类Computer,其中cpu与ram是必填参数,而其他3个是可选参数,那么我们如何构造这个类的实例呢,通常有两种常用的方式:

    public class Computer {
        private String cpu;//必须
        private String ram;//必须
        private int usbCount;//可选
        private String keyboard;//可选
        private String display;//可选
    }

    2.1 实现方式

    1. 在Computer 中创建一个静态内部类 Builder,然后将Computer 中的参数都复制到Builder类中。
    2. 在Computer中创建一个private的构造函数,参数为Builder类型
    3. 在Builder中创建一个public的构造函数,参数为Computer中必填的那些参数,cpu 和ram。
    4. 在Builder中创建设置函数,对Computer中那些可选参数进行赋值,返回值为Builder类型的实例
    5. 在Builder中创建一个build()方法,在其中构建Computer的实例并返回

    下面代码就是最终的样子

    public class Computer {
        private final String cpu;//必须
        private final String ram;//必须
        private final int usbCount;//可选
        private final String keyboard;//可选
        private final String display;//可选
    
        private Computer(Builder builder){
            this.cpu=builder.cpu;
            this.ram=builder.ram;
            this.usbCount=builder.usbCount;
            this.keyboard=builder.keyboard;
            this.display=builder.display;
        }
        public static class Builder{
            private String cpu;//必须
            private String ram;//必须
            private int usbCount;//可选
            private String keyboard;//可选
            private String display;//可选
    
            public Builder(String cup,String ram){
                this.cpu=cup;
                this.ram=ram;
            }
    
            public Builder setUsbCount(int usbCount) {
                this.usbCount = usbCount;
                return this;
            }
            public Builder setKeyboard(String keyboard) {
                this.keyboard = keyboard;
                return this;
            }
            public Builder setDisplay(String display) {
                this.display = display;
                return this;
            }        
            public Computer build(){
                return new Computer(this);
            }
        }
      //省略getter方法
    }

    2.2 使用方法

    在客户端使用链式调用,一步一步的把对象构建出来。

    Computer computer=new Computer.Builder("因特尔","三星")
                    .setDisplay("三星24寸")
                    .setKeyboard("罗技")
                    .setUsbCount(2)
                    .build();

    3.传统实现

    当一个类的构造函数参数超过4个,而且这些参数有些是可选的时,我们通常有两种办法来构建它的对象。

    3.1 折叠构造函数模式(telescoping constructor pattern )

    public class Computer {
         ...
        public Computer(String cpu, String ram) {
            this(cpu, ram, 0);
        }
        public Computer(String cpu, String ram, int usbCount) {
            this(cpu, ram, usbCount, "罗技键盘");
        }
        public Computer(String cpu, String ram, int usbCount, String keyboard) {
            this(cpu, ram, usbCount, keyboard, "三星显示器");
        }
        public Computer(String cpu, String ram, int usbCount, String keyboard, String display) {
            this.cpu = cpu;
            this.ram = ram;
            this.usbCount = usbCount;
            this.keyboard = keyboard;
            this.display = display;
        }
    }

    3.2 Javabean 模式

    如下所示

    public class Computer {
            ...
    
        public String getCpu() {
            return cpu;
        }
        public void setCpu(String cpu) {
            this.cpu = cpu;
        }
        public String getRam() {
            return ram;
        }
        public void setRam(String ram) {
            this.ram = ram;
        }
        public int getUsbCount() {
            return usbCount;
        }
    ...
    }

    3.3 这两种方式有什么弊端?

    第一种主要是使用及阅读不方便。你可以想象一下,当你要调用一个类的构造函数时,你首先要决定使用哪一个,然后里面又是一堆参数,如果这些参数的类型很多又都一样,你还要搞清楚这些参数的含义,很容易就传混了。。。那酸爽谁用谁知道。

    第二种方式在构建过程中对象的状态容易发生变化,造成错误。因为那个类中的属性是分步设置的,所以就容易出错。

    为了解决这两个痛点,builder模式就横空出世了。

    4. 参考文献

    https://zhuanlan.zhihu.com/p/58093669

  • 相关阅读:
    什么是ORM
    ORM优缺点
    Azure 中快速搭建 FTPS 服务
    连接到 Azure 上的 SQL Server 虚拟机(经典部署)
    在 Azure 虚拟机中配置 Always On 可用性组(经典)
    SQL Server 2014 虚拟机的自动备份 (Resource Manager)
    Azure 虚拟机上的 SQL Server 常见问题
    排查在 Azure 中新建 Windows 虚拟机时遇到的经典部署问题
    上传通用化 VHD 并使用它在 Azure 中创建新 VM
    排查在 Azure 中新建 Windows VM 时遇到的部署问题
  • 原文地址:https://www.cnblogs.com/frankcui/p/14502794.html
Copyright © 2011-2022 走看看