SpringBoot设计模式-建造者模式/静态内部类的应用

建造者模式

用途:使得类可以以链式方法实例化对象

意义:其实现是静态内部类的典型应用,可以让大家很好理解静态内部类的意义

为什么用内部类? 为什么是静态?

首先,实例化对象的常见做法就是创建一个空实例,然后多次调用set方法;

public class User {

    private String name;
    private Integer age;
    
    public void setName(String name) {
        this.name = name;    }
    public void setAge(Integer age) {
        this.age = age;    }
}

对应的实例化对象实例化过程:

User user = new User();
user.setName("Evan");
user.setAge(25);

这一段大家一定非常熟悉,当字段特别多的时候简直无聊到爆,有没有一种更舒服的方式实力化对象呢?

有,那就是链式方式实力化对象,爽吧,一直一直.set下去,怎么做到的呢?

UserBuilder userB = new UserBuilder().setName("Evan").setAge(25);

很巧妙的一种方式,每个set函数返回值都是this,类型都是UserBuilder,这样就可以一直调用下去,是不是很机智。但是这样也有一些问题。

public class UserBuilder {

    private String name;
    private Integer age;

    public UserBuilder setName(String name){
        this.name = name;
        return this;
    }
    public UserBuilder setAge(Integer name){
        this.age=age;
        return this;
    }
}

使用UserBuilder只是常见实例化方式的一种不同,UserBuilder类虽然内容相同,返回的不是User类,有人说简单UserBuilder改成User不就可以了吗,但是这样和User重名了,而且是单独一个文件。综上我们发现:

  1. UserBuilder最好能返回User对象;
  2. UserBuilder没必要单独以class文件形式存在,只是User类实例化的一种备选;

如何才能让好用的UserBuilder成为User的一部分呢?

成为内部类:

public class User {

    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    //静态内部类 这样可以通过User直接调用 User.UserBuilder可以当成一个新类看
    public static class UserBuilder {

        private String name;
        private Integer age;

        public UserBuilder setName(String name){
            this.name = name;
            return this;
        }
        public UserBuilder setAge(Integer name){
            this.age=age;
            return this;
        }
        //通过UserBuilder调用链式方法实例化,返回对应的User对象
        public User build(){
            return new User(name, age);
        }
    }
}

这样我们就看出了使用内部类的精髓:

内部类和外部类有强相关关系,辅助外部类而存在,无需单独存在。

如本文中的UserBuilder只是User实例化的一种替补方式

那么为什么是静态类呢,因为方便调用,UserBuilder作为User的静态成员,可以通过User直接调用 User.UserBuilder可以当成一个新类看 ,如下创建

User user = new User.UserBuilder()
                .setName("Evan")
                .setAge(10).build();

当然不使用静态也是可以的,但是就很麻烦,需要先创建user对象,再实例化UserBuilder类:

User user = new User();
User user2 = user.new UserBuilder()
                .setName("Evan")
                .setAge(10).build();

所以使用静态内部类,在这里主要是考虑调用UserBuilder方便。

此外,静态内部类的特点还包括只能访问外部类的静态成员变量,静态成员方法

不过本例内部类只作为外部类补充,没有与外部类变量的交互。希望通过我的讲解,让大家对建造者模式和静态内部类有更深的了解



猜你喜欢

转载自blog.csdn.net/evanxuhe/article/details/79477163