潦草白纸

设计模式学习心得<建造者 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...

posted on 2018-06-12 15:56  潦草白纸  阅读(241)  评论(0编辑  收藏  举报

导航