zoukankan      html  css  js  c++  java
  • 设计模式学习心得<建造者 Builder>

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

    这种一步一步构造最终的对象的方式叫做 柯里化 (Currying)

    概述


    • 意图:
      将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

    • 主要解决:
      主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;
      由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
      拆解产品的实现过程,让我联想到了敏捷开发。

    • 何时使用:
      一些基本部件不会变,而其组合经常变化的时候。

    • 如何解决:
      将变与不变分离开。

    • 关键代码:
      建造者:创建和提供实例
      导演:管理建造出来的实例的依赖关系。

    • 应用实例:

    1. 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
    2. JAVA 中的 StringBuilder。
    • 优点:
    1. 建造者独立,易扩展。
    2. 便于控制细节风险。
    • 缺点:
    1. 产品必须有共同点,范围有限制。
    2. 如内部变化复杂,会有很多的建造类。
    • 使用场景:
    1. 需要生成的对象具有复杂的内部结构。
    2. 需要生成的对象内部属性本身相互依赖。
    • 注意事项:
      与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

    实现


    public class Message {
        private Integer id;
        private String phone;
        private String token;
        private String verificationCode;
        private Date verifiedAt;
        private String ipAddress;
        private Date createdAt;
        private Date updatedAt;
    
        public Message() {
        }
    
        public Message(String phone, String ipAddress, String token) {
            this.phone = phone;
            this.ipAddress = ipAddress;
            this.token = token;
        }
    
        public Message(String phone, String ipAddress, String token, String verificationCode) {
            this.phone = phone;
            this.ipAddress = ipAddress;
            this.token = token;
            this.verificationCode = verificationCode;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        ..........
    
        public static MessageBuilder builder() {
            return new MessageBuilder();
        }
    
        public static class MessageBuilder {
    
            private String phone;
    
            private String ipAddress;
    
            private String token;
    
            private String verificationCode;
    
            public MessageBuilder withPhone(String phone) {
                this.phone = phone;
                return this;
            }
    
            public MessageBuilder withIpAddress(String ipAddress) {
                this.ipAddress = ipAddress;
                return this;
            }
    
            public MessageBuilder withToken(String token) {
                this.token = token;
                return this;
            }
    
            public MessageBuilder withVerificationCode(String verificationCode) {
                this.verificationCode = verificationCode;
                return this;
            }
    
            public Message build() {
                return new Message(phone, ipAddress, token, verificationCode);
            }
        }
    }
    

    提示:如果是使用idea,可以利用构造方法,协助生成构造者模式

    1. 选中构造方法,点击右键
    2. 选择Refactor,打开子菜单
    3. 点击Replace Constructor With Builder...
  • 相关阅读:
    Windows环境中Java多个JDK之间相互切换
    百度地图调用,传递经纬度到后台
    富文本的使用-KindEditor
    Play框架的@OneToMany、@ManyToOne级联操作
    Play框架文件上传
    [20171211][转载]如何实现dbms_output输出没有打开serveroutput on.txt
    [20171211]ora-16014 11g.txt
    [20171206]rman与truncate2.txt
    [20171206]rman与truncate.txt
    [20171205]uniq命令的输入输出.txt
  • 原文地址:https://www.cnblogs.com/snifferhu/p/9173468.html
Copyright © 2011-2022 走看看