创建型模式-建造者模式Builder-解决复杂对象创建问题
创建型模式
建造者模式(Builder)
解决复杂对象创建问题
描述
通过将一个复杂对象的构建过程分解为多个简单对象的构建步骤,并定义一个统一的构建接口,使得客户端无需知道具体的构建细节和顺序,就能够获得一个完整的复杂对象。这种方式可以提高代码的可读性和可维护性,同时也能够支持不同的构建流程和构建方案。
适用环境
需要创建的对象较为复杂,由多个部分组成,并且构建过程比较稳定。需要在不同的情况下创建出不同属性的完整对象。
优点:
将一个复杂对象的构建过程分离为多个简单对象的构建步骤,使得系统更加灵活。可以通过不同的建造顺序和方式来创建具有不同属性的完整对象。
缺点:
建造者模式需要新增很多类,增加了系统的复杂度。
违反原则
可能违反开闭原则:如果增加或删除一个组件,则需要修改具体建造者类。
可能违反里氏替换原则:建造者返回的产品类型可能会有所不同。
代码实现
背景描述
书籍一般包含四个属性:书名、作者、出版日期和ISBN号码
想要创建一个新的Book对象,但不通过构造函数将所有属性传递给它这样会导致代码冗长且难以维护
使用建造者模式可以将书籍对象的构建与其表示分离开来,并使得构建过程变得更加简单易用
下面是上述例子的Java代码实现:
//书籍类
class Book {
private String title;
private String author;
private String publicationDate;
private String isbn;
// 私有化构造方法
private Book(String title, String author, String publicationDate, String isbn) {
this.title = title;
this.author = author;
this.publicationDate = publicationDate;
this.isbn = isbn;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public String getPublicationDate() {
return publicationDate;
}
public String getIsbn() {
return isbn;
}
// 静态内部类Builder
public static class Builder {
private String title;
private String author;
private String publicationDate;
private String isbn;
// 设置书名
public Builder setTitle(String title) {
this.title = title;
return this;
}
// 设置作者
public Builder setAuthor(String author) {
this.author = author;
return this;
}
// 设置出版日期
public Builder setPublicationDate(String publicationDate) {
this.publicationDate = publicationDate;
return this;
}
// 设置ISBN号码
public Builder setIsbn(String isbn) {
this.isbn = isbn;
return this;
}
// 构建Book对象
public Book build() {
return new Book(title, author, publicationDate, isbn);
}
}
}
代码示例中将Book类的构造函数私有化,并添加静态内部类Builder。
Builder类包含四个setter方法来设置Book对象的属性,调用Book类私有构造函数来构建完整的Book对象。
使用建造者模式,我们可以通过以下方式创建一个新的Book对象
这样做使得构建过程变得更加直观简洁,并且可以避免大量的构造函数重载,从而提高代码可读性和可维护性
Book book = new Book.Builder()
.setTitle("战争与和平")
.setAuthor("列夫·托尔斯泰")
.setPublicationDate("1869年至1870年")
.setIsbn("978-7-111-54803-2")
.build();