• 大话设计模式:建造者模式


    建造者模式适用于对象属性太多的情况

    有一个属性非常多的类:Person

    public class Person {
        
        private String a;
        private String b;
        private String c;
        private String d;
        private String e;
        private String f;
        private String g;
        private String h;
        private String i;
        private String j;
        
        // get/set 方法
        
        // 构造方法1
        // 构造方法2
        // 构造方法3
        // 构造方法4
        // 构造方法5
        // 构造方法6
        
    }
    

    Person类的属性非常多,我们在创建不同属性的Person的时候,需要写很多的构造方法来应对不同的场景,这样代码非常臃肿,解决方法有两个,一个是采用BeanSet方式,一个就是使用Build模式。

    BeanSet方式

    public class Person {
        
        private String a;
        private String b;
        private String c;
        private String d;
        private String e;
        private String f;
        private String g;
        private String h;
        private String i;
        private String j;
        
        public void setA(String a) {
            this.a = a;
        }
        
        // ......
        
    }
    

    这种BeanSet方式是常用的方式,现在插件行业很发达,大名鼎鼎的Lombok自动为我们生成了get和set方法,这样省去了我们写get和set方法的时间,代码显得很干净,但是,在我们创建对象的时候,不得不这样:

        public static void main(String[] args) {
            Person person = new Person();
            person.setA("");
            person.setB("");
            person.setC("");
            person.setD("");
            person.setE("");
            person.setF("");
            person.setG("");
            person.setH("");
            person.setI("");
            person.setJ("");
        }
    

    这样写没毛病,但总感觉差那么一点啊。

    Builder模式

    标准写法

    1. 抽象建造者,一般是一个接口,包含创建产品对象的方法
    2. 导演者,调用具体建造者,创建产品对象
    3. 具体建造者
    4. 生成产品对象

    这种写法优点繁琐,日常工作中基本很少用到。

    一般写法

    一般写法省去了抽象建造者导演者,采用静态内部类的方式来创建建造者

    public class User {
    
        private String name;
    
        private Integer age;
    
        private String gender;
    
        private String mobile;
    
        private String idCard;
    
        private String address;
    
        private User(Builder builder) {
            this.name = builder.name;
            this.age = builder.age;
            this.gender = builder.gender;
            this.mobile = builder.mobile;
            this.idCard = builder.idCard;
            this.address = builder.address;
        }
    
        public static class Builder {
    
            /**require**/
            private final String name;
    
            private final Integer age;
    
            /**optional**/
            private String gender;
    
            private String mobile;
    
            private String idCard;
    
            private String address;
    
            public Builder(String name, Integer age) {
                this.name = name;
                this.age = age;
            }
    
            public Builder gender(String gender) {
                this.gender = gender;
                return this;
            }
    
            public Builder mobile(String mobile) {
                this.mobile = mobile;
                return this;
            }
    
            public Builder idCard(String idCard) {
                this.idCard = idCard;
                return this;
            }
    
            public Builder address(String address) {
                this.address = address;
                return this;
            }
    
            public User build() {
                return new User(this);
            }
    
        }
    
    }
    

    使用方式

    public static void main(String[] args) {
            User use = new Builder("zhangsan", 12).address("beijing").build();
    }
    
  • 相关阅读:
    浅尝辄止——在C++中调用C#的回调函数——COM方式
    代码管理——如何连接Git Server,下载代码
    浅尝辄止——使用ActiveX装载WPF控件
    软件调试——CPU异常列表
    软件调试——IA-32 保护模式下寄存器一览
    Delphi面向对象编程
    看雪2017CTF第二题解法
    串操作指令
    MASM 重复汇编
    MASM 宏结构
  • 原文地址:https://www.cnblogs.com/zhangjianbing/p/13656064.html
Copyright © 2020-2023  润新知