生成器模式(Builder Pattern)是一种创建型设计模式,旨在通过一步一步地构建复杂对象,使得构建过程与表示分离。
该模式通过将对象的构建过程拆分为多个独立的步骤,并提供一个指导者(Director)来协调这些步骤的顺序和执行方法。具体而言,生成器模式通常包含以下角色:
- 产品(Product):表示最终构建的对象,具有多个组成部分。
- 抽象生成器(Abstract Builder):定义构建产品所需的各个步骤和方法,并声明一个获取最终产品的接口。
- 具体生成器(Concrete Builder):实现抽象生成器定义的方法,负责构建产品的具体步骤。
- 指导者(Director):协调构建过程的顺序和执行方法,通过给定的具体生成器来构建最终的产品。
生成器模式的优势在于可以更加灵活地构建复杂对象,同时隐藏了构建细节。它可以逐步构建对象,使得每个步骤都有明确的目标和职责,易于维护和扩展。另外,通过引入指导者角色,客户端代码与具体的构建过程解耦,使得客户端更加简洁。
生成器模式经常应用于需要构建具有复杂内部结构的对象,或者构建过程涉及到多个步骤、组件的场景。例如,在创建一个包含多个部分的文档时,可以使用生成器模式来逐步构建标题、内容、作者等部分,并最终组装成一个完整的文档对象。
public class Document {
private String title;
private String content;
private String author;
public void setTitle(String title) {
this.title = title;
}
public void setContent(String content) {
this.content = content;
}
public void setAuthor(String author) {
this.author = author;
}
public void showDocument() {
System.out.println("Title: " + title);
System.out.println("Content: " + content);
System.out.println("Author: " + author);
}
}
public interface DocumentBuilder {
void buildTitle(String title);
void buildContent(String content);
void buildAuthor(String author);
Document getDocument();
}
public class SimpleDocumentBuilder implements DocumentBuilder {
private Document document;
public SimpleDocumentBuilder() {
this.document = new Document();
}
@Override
public void buildTitle(String title) {
document.setTitle(title);
}
@Override
public void buildContent(String content) {
document.setContent(content);
}
@Override
public void buildAuthor(String author) {
document.setAuthor(author);
}
@Override
public Document getDocument() {
return document;
}
}
public class Director {
private DocumentBuilder documentBuilder;
public Director(DocumentBuilder documentBuilder) {
this.documentBuilder = documentBuilder;
}
public void constructDocument(String title, String content, String author) {
documentBuilder.buildTitle(title);
documentBuilder.buildContent(content);
documentBuilder.buildAuthor(author);
}
}
public class Client {
public static void main(String[] args) {
DocumentBuilder documentBuilder = new SimpleDocumentBuilder();
Director director = new Director(documentBuilder);
director.constructDocument("Sample Document", "This is content of the document", "John");
Document document = documentBuilder.getDocument();
document.showDocument();
}
}