构造者Builder模式

根据对象的属性行为创建实例,通常有几种方法:

(1)通过带有参数的构造函数(同时函数重载),来满足根据不同属性(必选属性,可选属性)创建对象

(2)通过无参构造函数(或者有参构造函数),再配合属性的getter,setter方法灵活地设置对象的属性

(3)通过Builder模式创建对象

分析几种方式的特点:

方式(1)(2)对于简单对象的创建比较合适,这种场景下对象属性基本固定且属性的数量不多,多使用几个构造函数或者getter,setter好像代码复杂程度也可以接受;

方式(3)更多用于对象属性较多且属性存在必选属性以及可选属性,client端可以根据需要有选择地设置对象的属性,而且这种方式不支持对象属性的setter方法,另外这种方式基本支持对象创建过程中的链式编程。

举例 (Book 不能通过其构造函数直接创建,且创建之后不可变,只有getter方法):

public class Book {

    private final String author; //作者
    private final String name; //书名
    private final int pageNumber; //页数
    private final String type; //书的类别
    private final String press; //出版社
    
    private Book(Builder builder) {
        this.author = builder.author;
        this.name = builder.name;
        this.pageNumber = builder.pageNumber;
        this.type = builder.type;
        this.press = builder.press;
    }
    
    public String getAuthor() {
        return author;
    }
    public String getName() {
        return name;
    }
    public int getPageNumber() {
        return pageNumber;
    }
    public String getType() {
        return type;
    }
    public String getPress() {
        return press;
    }
    @Override
    public String toString() {
        return "Book [author=" + author + ", name=" + name + ", pageNumber=" + pageNumber + ", type=" + type
                + ", press=" + press + "]";
    }

    public static class Builder {
        private final String author; //作者
        private final String name; //书名
        private final int pageNumber; //页数
        private String type; //书的类别
        private String press; //出版社
        public Builder(String author, String name, int pageNumber) {
            this.author = author;
            this.name = name;
            this.pageNumber = pageNumber;
        }
        public Builder setType(String type) {
            this.type = type;
            return this;
        }
        public Builder setPress(String press) {
            this.press = press;
            return this;
        }
        public Book build() {
            return new Book(this);
        }
        
    } 
    
}

使用(链式编程):

猜你喜欢

转载自blog.csdn.net/u012989337/article/details/82490819