创建者模式介绍
创建者模式(Builder Pattern)是一种创建型设计模式,用于解决在创建复杂对象时,如何将构造过程与对象本身分离的问题。这种模式通过将对象的构建过程与使用过程分离,使得同样的构建过程可以创建不同的表示,从而提高代码的可扩展性和可维护性。
创建者模式包含以下主要角色:
- 抽象创建者(AbstractCreator):定义一个创建对象的接口,声明一个抽象的创建方法,该方法返回一个抽象的产品对象。
- 具体创建者(ConcreteCreator):实现抽象创建者接口,提供具体的产品创建方法。
- 抽象产品(AbstractProduct):定义产品对象的接口,声明一个抽象的表示方法,该方法返回产品对象的表示。
- 具体产品(ConcreteProduct):实现抽象产品接口,提供具体的产品表示。
创建者模式的使用场景包括:
- 当一个类中有多个可选属性,而不同组合需要创建不同的对象时,可以使用创建者模式。
- 当一个类的构造函数参数过多,或者构造函数需要调用多个方法时,可以使用创建者模式。
- 当一个类的实例化过程需要大量重复代码时,可以使用创建者模式。
创建者模式的优点包括:
- 将对象的创建和使用过程分离,提高了代码的可扩展性和可维护性。
- 使得同样的构建过程可以创建不同的表示,提高了代码的灵活性。
- 隐藏了对象的创建细节,使得客户端代码更加简洁。
创建者模式的缺点包括:
- 增加了系统的复杂度,需要定义多个类和接口。
- 如果产品类中添加新的属性,则需要修改创建者类和具体产品类。
- 如果产品类有多个抽象方法,则无法使用创建者模式。
创建者模式的实现
- 产品(Product)类 - HTML 文档(HtmlDocument)
package xyz.xiaolinz.demo.builder.demo1;
import lombok.Data;
/**
* html文档 - 产品角色类
*
* @author huangmuhong
* @version 1.0.0
* @date 2023/8/3
*/
@Data
public class HtmlDocument {
private String header = "";
private String body = "";
private String footer = "";
}
- 抽象创建者(Abstract Builder)类 - HtmlDocumentBuilder:
package xyz.xiaolinz.demo.builder.demo1;
import lombok.Getter;
/**
* 抽象 html 文档生成器 - 抽象创建者
*
* <p>定义了创建产品的抽象方法
*
* @author huangmuhong
* @version 1.0.0
* @date 2023/8/3
*/
@Getter
public abstract class AbstractHtmlDocumentBuilder {
protected HtmlDocument htmlDocument;
public void createHtmlDocument() {
htmlDocument = new HtmlDocument();
}
public abstract void buildHeader();
public abstract void buildBody();
public abstract void buildFooter();
}
- 具体创建者(Concrete Builder)类 - ArticleHtmlDocumentBuilder:
package xyz.xiaolinz.demo.builder.demo1;
/**
* 文章 html 文档生成器 - 具体创建者
*
* <p>实现了抽象创建者定义的方法,完成产品的创建
*
* @author huangmuhong
* @version 1.0.0
* @date 2023/8/3
*/
public class ArticleHtmlDocumentBuilder extends AbstractHtmlDocumentBuilder {
@Override
public void buildHeader() {
htmlDocument.setHeader("Article Header");
}
@Override
public void buildBody() {
htmlDocument.setBody("Article Body");
}
@Override
public void buildFooter() {
htmlDocument.setFooter("Article Footer");
}
}
- 指挥者(Director)类 - HtmlDirector:
package xyz.xiaolinz.demo.builder.demo1;
/**
* 指挥者(Director)类 - HtmlDirector
*
* @author huangmuhong
* @date 2023/11/23
* @version 1.0.0
*
*/
public class HtmlDirector {
private final AbstractHtmlDocumentBuilder htmlDocumentBuilder;
public HtmlDirector(AbstractHtmlDocumentBuilder htmlDocumentBuilder) {
this.htmlDocumentBuilder = htmlDocumentBuilder;
}
public HtmlDocument construct() {
htmlDocumentBuilder.createHtmlDocument();
htmlDocumentBuilder.buildHeader();
htmlDocumentBuilder.buildBody();
htmlDocumentBuilder.buildFooter();
return htmlDocumentBuilder.getHtmlDocument();
}
public HtmlDocument getDocument() {
return htmlDocumentBuilder.getHtmlDocument();
}
}
评论区