文章目录
- [建造者模式:理论、Java 实现与实践解析](#建造者模式:理论、Java 实现与实践解析)
建造者模式:理论、Java 实现与实践解析
一、建造者模式概述
建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。该模式的核心在于将复杂对象的创建过程分解为多个简单的步骤,由不同的建造者来实现这些步骤,最后通过一个指挥者来协调各个建造者,完成复杂对象的构建。这种模式适用于创建复杂对象的场景,如创建一个包含多个部件且部件之间有特定组合关系的产品,像电脑的组装(包括主机、显示器、键盘、鼠标等部件)或者一份具有多种配料和制作步骤的套餐等。
二、Java 实现示例
(一)产品类
首先定义要构建的复杂产品类,例如一个简单的电脑类:
java
public class Computer {
private String cpu;
private String memory;
private String hardDisk;
private String graphicsCard;
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void setMemory(String memory) {
this.memory = memory;
}
public void setHardDisk(String hardDisk) {
this.hardDisk = hardDisk;
}
public void setGraphicsCard(String graphicsCard) {
this.graphicsCard = graphicsCard;
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", memory='" + memory + '\'' +
", hardDisk='" + hardDisk + '\'' +
", graphicsCard='" + graphicsCard + '\'' +
'}';
}
}
(二)抽象建造者类
接着创建抽象建造者类,它定义了构建产品各个部件的抽象方法:
java
public abstract class ComputerBuilder {
protected Computer computer;
public Computer getComputer() {
return computer;
}
public void createComputer() {
computer = new Computer();
}
public abstract void buildCpu();
public abstract void buildMemory();
public abstract void buildHardDisk();
public abstract void buildGraphicsCard();
}
(三)具体建造者类
然后实现具体的建造者类,例如高性能电脑建造者和普通办公电脑建造者:
- 高性能电脑建造者:
java
public class HighPerformanceComputerBuilder extends ComputerBuilder {
@Override
public void buildCpu() {
computer.setCpu("Intel Core i9");
}
@Override
public void buildMemory() {
computer.setMemory("32GB DDR4");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("1TB SSD");
}
@Override
public void buildGraphicsCard() {
computer.setGraphicsCard("NVIDIA GeForce RTX 3090");
}
}
- 普通办公电脑建造者:
java
public class OfficeComputerBuilder extends ComputerBuilder {
@Override
public void buildCpu() {
computer.setCpu("Intel Core i3");
}
@Override
public void buildMemory() {
computer.setMemory("8GB DDR4");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("500GB HDD");
}
@Override
public void buildGraphicsCard() {
computer.setGraphicsCard("Integrated Graphics");
}
}
(四)指挥者类
最后创建指挥者类,它负责调用建造者的方法来构建产品:
java
public class ComputerDirector {
private ComputerBuilder builder;
public ComputerDirector(ComputerBuilder builder) {
this.builder = builder;
}
public Computer construct() {
builder.createComputer();
builder.buildCpu();
builder.buildMemory();
builder.buildHardDisk();
builder.buildGraphicsCard();
return builder.getComputer();
}
}
三、关键步骤
(一)创建产品对象
在具体建造者类中,首先通过 createComputer
方法创建一个电脑对象实例,这是构建复杂对象的基础。例如在 HighPerformanceComputerBuilder
和 OfficeComputerBuilder
类中都继承了这个方法来初始化电脑对象。
(二)构建部件
各个具体建造者类分别实现抽象建造者类中的抽象方法来构建产品的不同部件。如高性能电脑建造者会为电脑设置高性能的 CPU、大容量内存、高速硬盘和高端显卡;而普通办公电脑建造者则会设置相对较低配置的部件。
(三)指挥构建过程
指挥者类 ComputerDirector
接收一个具体的建造者对象作为参数,然后按照特定的顺序调用建造者的方法来构建完整的产品。它先调用 createComputer
初始化产品,接着依次调用构建各个部件的方法,最后返回构建好的电脑对象。
四、流程图
开始
|
|-- 创建具体建造者对象(如 HighPerformanceComputerBuilder 或 OfficeComputerBuilder)
| |
| |-- 创建指挥者对象,并传入建造者对象
| | |
| | |-- 指挥者调用 construct 方法
| | | |
| | | |-- 建造者调用 createComputer 方法创建产品对象
| | | |
| | | |-- 建造者依次调用 buildCpu、buildMemory、buildHardDisk、buildGraphicsCard 方法构建部件
| | | |
| | | |-- 指挥者返回构建好的产品对象
结束
五、应用场景
- 复杂对象构建:当创建的对象具有较多的组成部分,并且这些部分的组合方式较为复杂时,建造者模式能够清晰地将构建过程分步骤进行,提高代码的可读性和可维护性。例如构建一辆汽车,涉及到发动机、底盘、车身、内饰等多个复杂部件的组装。
- 对象构建过程的定制化:如果需要根据不同的需求或条件构建不同配置或样式的同一类对象,建造者模式可以方便地通过不同的建造者来实现。比如构建不同风格的房屋,有欧式风格、中式风格等,每种风格在墙体、屋顶、门窗等部件的构建上有不同的要求。
六、优缺点
(一)优点
- 解耦构建过程与产品表示:使得产品的构建过程和最终的产品表示可以独立变化,互不影响。例如可以在不改变电脑产品类的情况下,通过修改建造者类来改变电脑的配置构建方式。
- 便于精细化控制构建过程:可以精确地控制复杂对象的构建步骤和顺序,确保每个部件都按照要求进行构建。
- 代码复用性和扩展性好:通过抽象建造者类和具体建造者类的设计,可以方便地增加新的建造者来创建新的产品变体,同时指挥者类也可以复用。
(二)缺点
- 增加代码复杂度:由于引入了多个类(抽象建造者、具体建造者、指挥者等),会使代码结构相对复杂,对于简单对象的构建可能会显得过于繁琐。
- 需要额外的代码维护成本:要维护建造者类、指挥者类以及它们之间的关系,增加了代码的维护工作量。
七、总结
建造者模式在处理复杂对象的构建时提供了一种有效的解决方案,通过将构建过程分解并由专门的建造者和指挥者来处理,提高了代码的灵活性、可维护性和可扩展性。在实际应用中,需要根据对象的复杂程度、构建的多样性以及项目的整体架构等因素来决定是否采用建造者模式,以达到最佳的设计效果并平衡代码的复杂度和维护成本。