XiaoLin's Blog

Xiao Lin

创建者设计模式学习笔记

9
2024-02-26

创建者模式介绍

创建者模式(Builder Pattern)是一种创建型设计模式,用于解决在创建复杂对象时,如何将构造过程与对象本身分离的问题。这种模式通过将对象的构建过程与使用过程分离,使得同样的构建过程可以创建不同的表示,从而提高代码的可扩展性和可维护性。

创建者模式包含以下主要角色:

  1. 抽象创建者(AbstractCreator):定义一个创建对象的接口,声明一个抽象的创建方法,该方法返回一个抽象的产品对象。
  2. 具体创建者(ConcreteCreator):实现抽象创建者接口,提供具体的产品创建方法。
  3. 抽象产品(AbstractProduct):定义产品对象的接口,声明一个抽象的表示方法,该方法返回产品对象的表示。
  4. 具体产品(ConcreteProduct):实现抽象产品接口,提供具体的产品表示。

创建者模式的使用场景包括:

  1. 当一个类中有多个可选属性,而不同组合需要创建不同的对象时,可以使用创建者模式。
  2. 当一个类的构造函数参数过多,或者构造函数需要调用多个方法时,可以使用创建者模式。
  3. 当一个类的实例化过程需要大量重复代码时,可以使用创建者模式。

创建者模式的优点包括:

  1. 将对象的创建和使用过程分离,提高了代码的可扩展性和可维护性。
  2. 使得同样的构建过程可以创建不同的表示,提高了代码的灵活性。
  3. 隐藏了对象的创建细节,使得客户端代码更加简洁。

创建者模式的缺点包括:

  1. 增加了系统的复杂度,需要定义多个类和接口。
  2. 如果产品类中添加新的属性,则需要修改创建者类和具体产品类。
  3. 如果产品类有多个抽象方法,则无法使用创建者模式。

创建者模式的实现

  1. 产品(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 = "";

}

  1. 抽象创建者(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();

}

  1. 具体创建者(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");
  }
}

  1. 指挥者(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();
  }

}