建造者模式,又称为生成器模式,是一种较为复杂、使用频率不高的创建型模式。它为客户端返回的不是一个简单的产品,而是有多个部件组成的复杂产品。以手机为例,建造者模式返回的是一个完整的手机产品,而不是手机的各个部件,显示屏、听筒、主板、电源等,如何将这些部件组装成一个完整的手机给用户,这正是建造者模式解决的问题
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式
建造者模式允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节
下面以制作书籍为例,代码演示建造者模式
定义书籍产品类
package com.design.builder;
public class Book {
private String bookName; //书名
private String bookAuthor; //作者
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getBookAuthor() {
return bookAuthor;
}
public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}
@Override
public String toString() {
return "Book{" +
"bookName='" + bookName + '\'' +
", bookAuthor='" + bookAuthor + '\'' +
'}';
}
}
定义制作书籍的抽象类
这里可以理解为抽象的出版社
package com.design.builder;
public abstract class BookBuilder {
public abstract void buildBookName(String bookName);
public abstract void buildBookAuthor(String bookAuthor);
public abstract Book makeBook();
}
定义具体的制作书籍类,继承制作书籍抽象类
这里可以理解为具体的出版社,如中华书局出版社
package com.design.builder;
public class ZhongHuaBookBuilder extends BookBuilder{
Book book = new Book();
@Override
public void buildBookName(String bookName) {
book.setBookName(bookName);
}
@Override
public void buildBookAuthor(String bookAuthor) {
book.setBookAuthor(bookAuthor);
}
@Override
public Book makeBook() {
return book;
}
}
定义指挥者类
这里可以理解为出版书籍的负责人
package com.design.builder;
public class Publisher {
private BookBuilder bookBuilder;
public Publisher(BookBuilder bookBuilder){
this.bookBuilder = bookBuilder;
}
public Book makeBook(String bookName, String bookAuthor){
this.bookBuilder.buildBookName(bookName);
this.bookBuilder.buildBookAuthor(bookAuthor);
return this.bookBuilder.makeBook();
}
}
建造者模式代码演示完成
类图如下
测试调用
这里可以理解为书籍的出版负责人,通过中华书局出版社,出版了曹雪芹写的红楼梦
package com.design.builder;
public class TestMain {
public static void main(String[] args) {
BookBuilder bookBuilder = new ZhongHuaBookBuilder();
Publisher publisher = new Publisher(bookBuilder);
Book book = publisher.makeBook("红楼梦", "曹雪芹");
System.out.println(book);
}
}
建造者模式总结
适用场景:
需要生成的产品对象内部结构复杂(包含很多成员变量)
需要生成的产品对象的属性相互依赖,且需要指定其生成顺序
隔离复杂对象的创建和使用,且相同的创建过程可创建不同的产品
对象的创建过程独立于创建该对象的类