创建型模式-----建造者模式

建造者模式就是通过build方法创建出对象,可以有选择的给对象设置属性。
一般XxxBuilder就是使用了建造者模式定义的类。

创建一个User类,通过建造者模式创建出User对象。

package build;

/**
 * 建造者模式
 */
public class User {
    private String username;
    private String password;
    private String nickname;
    private int age;

    public User() {
    }

    public User(String username, String password, String nickname, int age) {
        this.username = username;
        this.password = password;
        this.nickname = nickname;
        this.age = age;
    }

    /**
     * static作用是可以通过类名直接返回UserBuilder对象,如果这个方法不加static调用方式:new User().builder().username().age()...
     * @return
     */
    public static UserBuilder builder(){
        return new UserBuilder();
    }

    /**
     * XxxBuilder与Xxx类有相同的属性
     */
    public static class UserBuilder{
        private String username;
        private String password;
        private String nickname;
        private int age;

        private UserBuilder() {
        }

        //给对象设置属性值,返回当前对象
        public UserBuilder username(String username) {
            this.username = username;
            return this;
        }

        public UserBuilder password(String password) {
            this.password = password;
            return this;
        }

        public UserBuilder nickname(String nickname) {
            this.nickname = nickname;
            return this;
        }

        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }

        /**
         * build方法将之前设置的值,放到构造中创建一个User对象。
         * @return
         */
        public  User build(){
            if (username == null || password == null) {
                throw new RuntimeException("用户名和密码必填");
            }
            if (age <= 0 || age >= 150) {
                throw new RuntimeException("年龄不合法");
            }
            // 还可以做赋予”默认值“的功能
            if (nickname == null) {
                nickname = username;
            }
            return new User(username,password,nickname,age);
        }
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", nickname='" + nickname + '\'' +
                ", age=" + age +
                '}';
    }
}

调用测试

public class BuilderTest {
    public static void main(String[] args) {
        User user = User.builder()
                .age(12)
                .username("xiaoguang")
                .password("123456")
                .nickname("guang")
                .build();
        System.out.println(user);

    }
}

在这里插入图片描述
通常建造者模式使用链式调用获取对象的方法很清晰,在最后build方法中可以有选择性的给对象设置属性,但是建造者模式中的Builder,通常和我们想要创建的对象的属性代码是重复的,例如上面的User和UserBuilder。

如果了解Lombok,可以直接使用Lombok的注解@Builder添加到实体类上,这样创建对象的时候,可以使用Build方法有选择性的设置属性值。

import lombok.Builder;

@Builder
public class User {
    private String username;
    private String password;
    private String nickname;
    private int age;

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", nickname='" + nickname + '\'' +
                ", age=" + age +
                '}';
    }

    public static class UserTest {
        public static void main(String[] args) {
            User user = User.builder().age(100).username("student").nickname("hello").build();
            System.out.println(user);

        }
    }
}

在这里插入图片描述
以上对建造者模式的了解就这么多,欢迎大家补充!

巨人的肩膀
javadoop.com

posted @ 2020-09-19 17:11  起个名字都这么男  阅读(106)  评论(0编辑  收藏  举报