Java设计模式——生成器模式
⚪生成器模式(Builder)是一种创建型设计模式,这种模式的核心思想是将对象的构建过程拆分成多个步骤,每个步骤由一个独立的构建器对象负责,最终组合成一个完整的对象。生成器模式通常用于创建具有多个可选参数的对象。
⚪意图:它用于创建一个复杂对象,但又希望能够将对象的构建过程和表示分离开来。
⚪以下是工厂方法模式的关键要点:
▷ 角色和责任:
- Builder(生成器):定义了创建对象的抽象接口,包括一系列构建步骤。
- ConcreteBuilder(具体生成器):实现了生成器接口,负责实际构建产品的各个部分,并提供一个用于获取最终产品的方法。
- Director(导演):负责指导构建过程的顺序,通常是通过将多个构建步骤按照一定顺序组织起来,最终生成产品。
- Product(产品):最终要创建的复杂对象,它通常包含了多个部分。
▷ 工作流程:
- 客户端通过实例化一个具体生成器对象,即 ConcreteBuilder。
- 客户端调用生成器的一系列方法来设置产品的各个部分,每个方法负责构建产品的一个部分。
- 客户端可以选择在设置完所有部分后,通过生成器的一个方法来获取最终的产品对象。
- 导演对象可以用来指导构建过程,将部分按照一定的顺序组织起来。
▷ 示例
- 首先定义产品 Computer,它包含了处理器、内存和硬盘:
public class Computer { private String cpu; private String memory; private String hardDisk; public Computer(String cpu, String memory, String hardDisk) { this.cpu = cpu; this.memory = memory; this.hardDisk = hardDisk; } // Getters for CPU, memory, and hard disk }
2. 定义了生成器接口 ComputerBuilder,它包含了设置处理器、内存和硬盘的方法:
public interface ComputerBuilder { void buildCPU(String cpu); void buildMemory(String memory); void buildHardDisk(String hardDisk); Computer getComputer(); }
3. 创建一个具体生成器 ConcreteComputerBuilder,它实现了生成器接口,并负责实际构建 Computer 对象:
public class ConcreteComputerBuilder implements ComputerBuilder { private Computer computer; public ConcreteComputerBuilder() { computer = new Computer("", "", ""); } @Override public void buildCPU(String cpu) { computer.setCpu(cpu); } @Override public void buildMemory(String memory) { computer.setMemory(memory); } @Override public void buildHardDisk(String hardDisk) { computer.setHardDisk(hardDisk); } @Override public Computer getComputer() { return computer; } }
4.创建一个导演 ComputerDirector 来指导构建过程:
public class ComputerDirector { public Computer buildComputer(ComputerBuilder builder) { builder.buildCPU("Intel i7"); builder.buildMemory("16GB DDR4"); builder.buildHardDisk("512GB SSD"); return builder.getComputer(); } }
5.使用生成器模式来构建计算机对象:
public class Main { public static void main(String[] args) { ComputerDirector director = new ComputerDirector(); ComputerBuilder builder = new ConcreteComputerBuilder(); Computer computer = director.buildComputer(builder); // 计算机已构建完成,可以使用 System.out.println("Computer CPU: " + computer.getCpu()); System.out.println("Computer Memory: " + computer.getMemory()); System.out.println("Computer Hard Disk: " + computer.getHardDisk()); } }
⚪适用性
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
⚪应用场景
- 创建复杂对象:当需要创建的对象具有复杂的构建过程,包含多个部分,每个部分可能有不同的配置选项时,生成器模式非常有用。它可以将对象的构建步骤分解为多个方法,使得构建过程更加清晰和可维护。
- 避免构造函数参数列表过长:如果一个类的构造函数需要大量的参数,使用构造函数传递所有参数会导致代码难以理解和维护。生成器模式允许通过链式调用方法来设置参数,使得代码更加清晰。
- 多种表示形式:当需要为同一对象创建不同的表示形式时,生成器模式非常有用。例如,可以使用不同的生成器创建 HTML、JSON 或 XML 文档。
- 产品变化不频繁:如果产品的部分结构相对稳定,但不同配置选项多种多样,生成器模式可以使得构建过程复用,只需改变具体生成器的配置即可。
⚪实际已有场景
-
StringBuilder 类:StringBuilder 类是 Java 标准库中的一个典型的生成器模式的应用。它用于构建字符串对象,允许你通过链式调用方法来构建字符串。
- Hibernate ORM:Hibernate 是一个流行的 Java 持久化框架,它使用生成器模式来构建查询语句。它的 Criteria API 允许你通过方法链式调用来构建数据库查询条件,而不是手动编写 SQL 语句。
-
Spring Framework:Spring 中的许多配置类也使用了生成器模式的概念。例如,org.springframework.context.annotation.BeanDefinitionBuilder 类允许你以编程方式构建 Bean 定义。这在编写自定义的 Spring 注解处理器时非常有用。
- RestTemplate:Spring 的 RestTemplate 类可以用于发送 HTTP 请求,并且允许你以链式方式设置请求参数、请求头等信息,以构建 HTTP 请求。