2025/9/19日 每日总结 设计模式实践:用建造者模式实现计算机组装
设计模式实践:用建造者模式实现计算机组装
在软件开发中,经常会遇到需要构建复杂对象的场景。这些对象由多个部件组成,且构建过程有固定的步骤,但具体部件的实现可能存在差异。这时,建造者模式就能派上用场——它将对象的构建与表示分离,让同样的构建过程可以创建不同的产品。本文就以计算机组装为例,分享建造者模式的实践过程。
一、模式理解:为什么选择建造者模式?
计算机组装场景有两个核心特点:
- 组成固定:无论笔记本还是台式机,都由CPU、内存、硬盘、主机四大核心部件组成;
- 实现差异:笔记本的硬件是便携优化版,台式机的硬件是性能优化版,部件具体实现不同。
如果直接在代码中硬编码构建逻辑,会导致代码冗余、扩展性差(新增平板设备时需大量修改)。而建造者模式通过以下角色解决这个问题:
-
产品(Product):最终构建的复杂对象(本文中的Computer);
-
抽象建造者(Builder):定义构建产品的抽象方法(组装各部件);
-
具体建造者(ConcreteBuilder):实现抽象方法,构建具体产品(笔记本/台式机建造者);
-
指挥者(Director):控制构建流程,按顺序调用建造者的方法(组装工厂)。
这种结构让构建流程与部件实现解耦,新增产品类型时只需添加新的具体建造者,无需修改现有逻辑。二、代码实现:一步步构建计算机组装系统
1. 产品类:Computer
封装计算机的核心部件,提供getter/setter方法用于部件赋值和获取。
public class Computer { private String cpu; private String memory; private String hardDisk; private String mainFrame; // Getter和Setter方法 public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public String getMemory() { return memory; } public void setMemory(String memory) { this.memory = memory; } public String getHardDisk() { return hardDisk; } public void setHardDisk(String hardDisk) { this.hardDisk = hardDisk; } public String getMainFrame() { return mainFrame; } public void setMainFrame(String mainFrame) { this.mainFrame = mainFrame; } }2. 抽象建造者:Builder
定义组装计算机的抽象方法,每个方法对应一个部件的构建,同时提供获取最终产品的方法。
public abstract class Builder { protected Computer computer = new Computer(); // 抽象构建方法:子类需实现具体部件 public abstract void buildCpu(); public abstract void buildMemory(); public abstract void buildHardDisk(); public abstract void buildMainFrame(); // 返回构建完成的计算机 public Computer getComputer() { return computer; } }3. 具体建造者:笔记本/台式机建造者
分别实现抽象建造者的方法,为不同类型的计算机配置对应的硬件部件。
笔记本电脑建造者(LaptopBuilder)
public class LaptopBuilder extends Builder { @Override public void buildCpu() { computer.setCpu("Intel Core i7-1165G7 (笔记本专用)"); } @Override public void buildMemory() { computer.setMemory("16GB DDR4 3200MHz (笔记本内存)"); } @Override public void buildHardDisk() { computer.setHardDisk("1TB NVMe SSD (笔记本硬盘)"); } @Override public void buildMainFrame() { computer.setMainFrame("轻薄型笔记本主机"); } }台式机建造者(DesktopBuilder)
public class DesktopBuilder extends Builder { @Override public void buildCpu() { computer.setCpu("AMD Ryzen 7 5800X (台式机CPU)"); } @Override public void buildMemory() { computer.setMemory("32GB DDR4 3600MHz (台式机内存)"); } @Override public void buildHardDisk() { computer.setHardDisk("2TB SATA SSD + 4TB HDD (台式机硬盘)"); } @Override public void buildMainFrame() { computer.setMainFrame("ATX中塔式主机箱"); } }4. 指挥者:Factory
控制组装流程,按固定顺序调用建造者的构建方法,避免客户端直接依赖构建细节。
public class Factory { private Builder computerBuilder; // 设置具体建造者 public void setBuilder(Builder builder) { this.computerBuilder = builder; } // 按顺序组装部件,返回成品 public Computer construct() { computerBuilder.buildCpu(); computerBuilder.buildMemory(); computerBuilder.buildHardDisk(); computerBuilder.buildMainFrame(); return computerBuilder.getComputer(); } }5. 客户端测试:模拟组装过程
通过切换不同的建造者,实现笔记本和台式机的组装,并输出配置信息。
public class Store { public static void main(String[] args) { Builder builder; Factory factory = new Factory(); // 组装台式机 builder = new DesktopBuilder(); factory.setBuilder(builder); Computer desktop = factory.construct(); System.out.println("台式机配置:"); System.out.println("CPU: " + desktop.getCpu()); System.out.println("内存: " + desktop.getMemory()); System.out.println("硬盘: " + desktop.getHardDisk()); System.out.println("主机: " + desktop.getMainFrame()); System.out.println("-------------------"); // 组装笔记本 builder = new LaptopBuilder(); factory.setBuilder(builder); Computer laptop = factory.construct(); System.out.println("笔记本电脑配置:"); System.out.println("CPU: " + laptop.getCpu()); System.out.println("内存: " + laptop.getMemory()); System.out.println("硬盘: " + laptop.getHardDisk()); System.out.println("主机: " + laptop.getMainFrame()); } }三、运行结果
台式机配置: CPU: AMD Ryzen 7 5800X (台式机CPU) 内存: 32GB DDR4 3600MHz (台式机内存) 硬盘: 2TB SATA SSD + 4TB HDD (台式机硬盘) 主机: ATX中塔式主机箱
笔记本电脑配置:
CPU: Intel Core i7-1165G7 (笔记本专用)
内存: 16GB DDR4 3200MHz (笔记本内存)
硬盘: 1TB NVMe SSD (笔记本硬盘)
主机: 轻薄型笔记本主机
## 四、类图设计
+----------------+
| Computer |
+----------------+
-
cpu: String
-
memory: String
-
hardDisk: String
-
mainFrame: String
-
getCpu(): String
-
setCpu(String): void
-
getMemory(): String
-
setMemory(String): void
-
getHardDisk(): String
-
setHardDisk(String): void
-
getMainFrame(): String
-
setMainFrame(String): void
+----------------+
^
|
+----------------+
| Builder |
+----------------+ -
computer: Computer
-
buildCpu(): void
-
buildMemory(): void
-
buildHardDisk(): void
-
buildMainFrame(): void
-
getComputer(): Computer
+----------------+
^
|
+----------------+ +----------------+
| LaptopBuilder | | DesktopBuilder |
+----------------+ +----------------+ -
buildCpu(): void + buildCpu(): void
-
buildMemory(): void + buildMemory(): void
-
buildHardDisk(): void + buildHardDisk(): void
-
buildMainFrame(): void + buildMainFrame(): void
+----------------+ +----------------+
^ ^
| |
+----------------+
| Factory |
+----------------+ -
builder: Builder
-
setBuilder(Builder): void
-
construct(): Computer
+----------------+## 五、模式总结与应用场景 ### 核心优势
-
解耦构建与表示:建造者负责部件实现,指挥者负责流程,客户端只需选择建造者;
-
扩展性强:新增产品(如平板、服务器)时,只需添加新的具体建造者,无需修改指挥者和产品类;
-
控制细节:可以精确控制复杂对象的构建步骤和部件配置。
适用场景
- 产品由多个部件组成,构建过程有固定步骤;
- 不同产品的部件实现不同,但构建流程一致;
- 需隐藏复杂对象的构建细节,避免客户端直接操作部件。
通过本次计算机组装的实践,我对建造者模式的核心思想有了更直观的理解。在实际开发中,类似的场景还有很多,比如文档生成(Word/PDF文档由标题、正文、图片等部件组成)、配置文件构建等,都可以用建造者模式来优化代码结构。

浙公网安备 33010602011771号