軟件工程學習日志2025.11.3
軟件設計模式 - 建造者模式實戰
? 實驗來源:石家莊鐵道大學信息學院實驗5
? 實驗類型:模仿型實驗
? 核心目標:深入理解建造者模式的原理并掌握實際應用
?? 建造者模式核心理解
模式動機
建造者模式的核心價值在于將復雜對象的構建過程與其表示分離。在計算機組裝這個典型案例中:
? 復雜對象:計算機(包含CPU、內存、硬盤、主機等多個部件)
? 穩定過程:組裝流程固定(安裝CPU→內存→硬盤→主機)
? 不同表示:最終產品可以是筆記本或臺式機等不同形態
模式優勢
- 構建過程封裝:指揮者統一管理組裝流程
- 產品表示靈活:相同構建過程可產生不同產品
- 符合開閉原則:新增計算機類型只需添加新建造者
??? 系統類圖設計
classDiagram
class Computer {
-String cpu
-String memory
-String hardDisk
-String mainFrame
+setCPU(String cpu)
+setMemory(String memory)
+setHardDisk(String hardDisk)
+setMainFrame(String mainFrame)
+show()
}
class ComputerBuilder {
<<abstract>>
#Computer computer
+buildComputer() void
+buildCPU() void
+buildMemory() void
+buildHardDisk() void
+buildMainFrame() void
+getComputer() Computer
}
class LaptopBuilder {
+buildCPU() void
+buildMemory() void
+buildHardDisk() void
+buildMainFrame() void
}
class DesktopBuilder {
+buildCPU() void
+buildMemory() void
+buildHardDisk() void
+buildMainFrame() void
}
class Director {
-ComputerBuilder builder
+setBuilder(ComputerBuilder builder)
+construct() Computer
}
ComputerBuilder <|-- LaptopBuilder
ComputerBuilder <|-- DesktopBuilder
ComputerBuilder o--> Computer
Director o--> ComputerBuilder
?? 核心代碼實現
- 產品類 - 計算機實體
/**
-
計算機產品類 - 代表被構建的復雜對象
*/
public class Computer {
private String cpu;
private String memory;
private String hardDisk;
private String mainFrame;// Setter方法
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 setMainFrame(String mainFrame) { this.mainFrame = mainFrame; }/**
- 展示電腦配置信息
*/
public void show() {
System.out.println("====== 電腦配置信息 ");
System.out.println("主機:" + mainFrame);
System.out.println("CPU:" + cpu);
System.out.println("內存:" + memory);
System.out.println("硬盤:" + hardDisk);
System.out.println("===================");
}
}
- 展示電腦配置信息
- 抽象建造者 - 定義構建接口
/**
-
抽象建造者 - 定義計算機組裝的通用接口
*/
public abstract class ComputerBuilder {
protected Computer computer;public Computer getComputer() {
return computer;
}/**
- 創建計算機實例
*/
public void buildNewComputer() {
computer = new Computer();
}
// 抽象構建方法
public abstract void buildMainFrame();
public abstract void buildCPU();
public abstract void buildMemory();
public abstract void buildHardDisk();
} - 創建計算機實例
- 具體建造者 - 筆記本構建器
/**
-
具體建造者 - 筆記本電腦組裝實現
*/
public class LaptopBuilder extends ComputerBuilder {@Override
public void buildMainFrame() {
computer.setMainFrame("聯想輕薄本專用主板");
System.out.println("安裝筆記本主板...");
}@Override
public void buildCPU() {
computer.setCPU("Intel Core i7-1260P 移動版");
System.out.println("安裝筆記本CPU...");
}@Override
public void buildMemory() {
computer.setMemory("16GB LPDDR5 4800MHz");
System.out.println("安裝筆記本內存...");
}@Override
public void buildHardDisk() {
computer.setHardDisk("1TB NVMe SSD");
System.out.println("安裝筆記本硬盤...");
}
}
- 具體建造者 - 臺式機構建器
/**
-
具體建造者 - 臺式電腦組裝實現
*/
public class DesktopBuilder extends ComputerBuilder {@Override
public void buildMainFrame() {
computer.setMainFrame("華碩TUF GAMING ATX大板");
System.out.println("安裝臺式機主板...");
}@Override
public void buildCPU() {
computer.setCPU("AMD Ryzen 7 7700X");
System.out.println("安裝臺式機CPU...");
}@Override
public void buildMemory() {
computer.setMemory("32GB DDR5 5200MHz");
System.out.println("安裝臺式機內存...");
}@Override
public void buildHardDisk() {
computer.setHardDisk("2TB SSD + 4TB HDD");
System.out.println("安裝臺式機硬盤...");
}
}
- 指揮者 - 控制構建流程
/**
-
指揮者 - 控制計算機的組裝流程
*/
public class Director {
private ComputerBuilder builder;public void setBuilder(ComputerBuilder builder) {
this.builder = builder;
}/**
-
構建計算機的穩定流程
*/
public Computer construct() {
System.out.println("開始組裝計算機...");builder.buildNewComputer(); // 步驟1:創建新計算機
builder.buildMainFrame(); // 步驟2:安裝主機
builder.buildCPU(); // 步驟3:安裝CPU
builder.buildMemory(); // 步驟4:安裝內存
builder.buildHardDisk(); // 步驟5:安裝硬盤System.out.println("計算機組裝完成!");
return builder.getComputer();
}
}
-
- 客戶端測試代碼
/**
-
客戶端測試類
*/
public class Client {
public static void main(String[] args) {
// 創建指揮者
Director director = new Director();System.out.println("=== 組裝筆記本電腦 ==="); // 組裝筆記本電腦 ComputerBuilder laptopBuilder = new LaptopBuilder(); director.setBuilder(laptopBuilder); Computer laptop = director.construct(); laptop.show(); System.out.println("\n=== 組裝臺式電腦 ==="); // 組裝臺式電腦 ComputerBuilder desktopBuilder = new DesktopBuilder(); director.setBuilder(desktopBuilder); Computer desktop = director.construct(); desktop.show(); // 驗證兩個計算機對象不同 System.out.println("兩臺電腦是否相同: " + (laptop == desktop));}
}
?? 運行結果示例
=== 組裝筆記本電腦 ===
開始組裝計算機...
安裝筆記本主板...
安裝筆記本CPU...
安裝筆記本內存...
安裝筆記本硬盤...
計算機組裝完成!
====== 電腦配置信息 ======
主機:聯想輕薄本專用主板
CPU:Intel Core i7-1260P 移動版
內存:16GB LPDDR5 4800MHz
硬盤:1TB NVMe SSD
=== 組裝臺式電腦 ===
開始組裝計算機...
安裝臺式機主板...
安裝臺式機CPU...
安裝臺式機內存...
安裝臺式機硬盤...
計算機組裝完成!
====== 電腦配置信息 ======
主機:華碩TUF GAMING ATX大板
CPU:AMD Ryzen 7 7700X
內存:32GB DDR5 5200MHz
硬盤:2TB SSD + 4TB HDD
兩臺電腦是否相同: false
?? 編程規范實踐總結
代碼規范要點
- 命名規范:類名大駝峰,方法名小駝峰
- 訪問控制:屬性private,建造者引用protected
- 注釋完整:每個類和方法都有JavaDoc說明
- 包結構清晰:相關類組織在合適包中
- 格式統一:一致的縮進和代碼風格
設計模式最佳實踐
- 單一職責:每個類職責明確
- 依賴倒置:依賴于抽象而非具體實現
- 開閉原則:易于擴展新的建造者
?? 學習收獲與反思
掌握程度評估
? ? 理解了建造者模式的結構和動機
? ? 能夠繪制標準的UML類圖
? ? 實現了完整的代碼示例
? ? 遵循了編程規范要求
實際應用思考
建造者模式不僅適用于計算機組裝,在軟件開發中還有很多應用場景:
? 文檔生成器(HTML、PDF等不同格式)
? 餐飲訂單系統(不同套餐組合)

浙公網安備 33010602011771號