根据对象的属性行为创建实例,通常有几种方法:
(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);
}
}
}
使用(链式编程):