天天看點

使用建構器模式優雅的建立對象

前言

通常我們建立對象 會使用以下兩種:

  1. 無參構造函數,使用set指派
  2. 帶參構造函數

如果需要動态參數,就需要多個構造函數,或者頻繁使用set方法,不夠優雅和直覺

//使用預設構造函數,set方法指派
        User defaultUser = new User();
        defaultUser.setUserName("yang.liu");
        defaultUser.setPassword("password");
        defaultUser.setAge(18);
        defaultUser.setSex(true);

        //使用帶參數構造函數, 需要多個構造函數,屬性指派不夠直覺
        User paramUserFirst = new User("yang.liu", "password");
        User paramUserSecond = new User("yang.liu", "password", 18, true);

           

建構器模式(Builder模式)

在類的内部寫一個靜态内部類,使用内部類進行建立類對象,并選擇性的設定屬性,不需要繁雜的setter與getter。

建立一個類

import lombok.Data;

/**
 * 使用者
 *
 * @author yang.liu
 */
@Data
public class User {

    private String userName;

    private String password;

    private Integer age;

    private Boolean sex;

    /**
     * 内部構造類
     */
    public static class Builder {

        public Builder() {
        }

        private User user = new User();

        public Builder userName(String userName) {
            this.user.setUserName(userName);
            return this;
        }

        public Builder password(String password) {
            this.user.setPassword(password);
            return this;
        }

        public Builder age(Integer age) {
            this.user.setAge(age);
            return this;
        }

        public Builder sex(Boolean sex) {
            this.user.setSex(sex);
            return this;
        }

        public User build() {
            return this.user;
        }

    }

    /**
     * 建立構造類對象
     *
     * @return
     */
    public static Builder builder() {
        return new Builder();
    }


}

           

使用示例

User user = User.builder()
                .userName("yang.liu")
                .password("password")
                .age(18)
                .sex(true).build();
           

LY.

使用内部構造類建立對象可以直覺看到屬性的指派,特别是用于多參數,需要靈活指派的對象建立時,如配置或者條件相關類。