创建型-综合题-Builder
发表于更新于
创建型-综合题-Builder
Rif题目
Java设计模式练习题:建造者模式 - 电脑组装工厂
一、案例背景
在现实中,电脑由多个部件组成,如CPU、内存、硬盘、主机、显示器等。用户只需告知需要哪种类型的电脑(如笔记本、台式机、服务器),电脑组装工厂将按照预设配置自动完成电脑部件的组装,返回一个完整可用的电脑对象。
我们希望使用建造者模式来设计这个电脑组装系统:
- 客户端只需指定电脑类型(例如:Laptop、Desktop、Server);
- 构造过程由工厂统一调度;
- 不同类型的电脑由不同的构建器(Builder)实现组装逻辑;
- 电脑最终由 Director 统一创建并返回给客户端。
二、任务说明
1. 请使用建造者设计模式完成以下功能:
· 定义产品类 Computer,包含部件:CPU、内存、硬盘、主机、显示器,提供属性设置与信息展示方法。
· 定义抽象建造者 ComputerBuilder,声明构建各个部件的方法及获取完整电脑的方法。
· 实现具体建造者:LaptopBuilder、DesktopBuilder、ServerBuilder,完成相应部件的构建逻辑。
· 定义指挥者 Director,统一调度构建顺序。
· 客户端通过 Director 使用不同 Builder 获取不同类型的电脑。
三、结构图(文字表示)
[Computer] ← 产品类
[ComputerBuilder] ← 抽象建造者
↑ ↑ ↑
[LaptopBuilder] [DesktopBuilder] [ServerBuilder] ← 具体建造者
[Director] ← 指挥者类
[Client] ← 客户端
四、示例运行结果
Laptop configuration:
CPU: Intel i5
Memory: 16GB
Hard Disk: 512GB SSD
Main Unit: Compact case
Display: 13.3 inch
Server configuration:
CPU: Intel Xeon
Memory: 64GB ECC
Hard Disk: 2TB SAS
Main Unit: Rack case
Display: None
五、提示建议
• 产品类可定义多个 setter 方法用于构建器注入部件。
• 每个具体 Builder 实现各自的组装细节。
• Director 内部按统一顺序调用 builder 的各个步骤。
代码实现
PlantUML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| @startuml !theme plain
' 产品类 class Computer { - cpu: String - memory: String - hardDisk: String - mainUnit: String - display: String + setCpu(cpu: String): void + setMemory(memory: String): void + setHardDisk(hardDisk: String): void + setMainUnit(mainUnit: String): void + setDisplay(display: String): void + showConfiguration(): void }
' 抽象建造者 abstract class ComputerBuilder { # computer: Computer + {abstract} buildCpu(): void + {abstract} buildMemory(): void + {abstract} buildHardDisk(): void + {abstract} buildMainUnit(): void + {abstract} buildDisplay(): void + getComputer(): Computer }
' 具体建造者 class LaptopBuilder { + buildCpu(): void + buildMemory(): void + buildHardDisk(): void + buildMainUnit(): void + buildDisplay(): void }
class DesktopBuilder { + buildCpu(): void + buildMemory(): void + buildHardDisk(): void + buildMainUnit(): void + buildDisplay(): void }
class ServerBuilder { + buildCpu(): void + buildMemory(): void + buildHardDisk(): void + buildMainUnit(): void + buildDisplay(): void }
' 指挥者 class Director { + construct(builder: ComputerBuilder): Computer }
' 客户端 class Client_3 { + {static} main(args: String[]): void }
' 关系定义 ComputerBuilder <|-- LaptopBuilder ComputerBuilder <|-- DesktopBuilder ComputerBuilder <|-- ServerBuilder
ComputerBuilder ..> Computer : builds > Director o-- ComputerBuilder : uses > Client_3 ..> Director Client_3 ..> ComputerBuilder Client_3 ..> Computer
@enduml
|
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
class Computer { private String cpu; private String memory; private String hardDisk; private String mainUnit; private String display; 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 setMainUnit(String mainUnit) { this.mainUnit = mainUnit; } public void setDisplay(String display) { this.display = display; } public void showConfiguration() { System.out.println("CPU: " + cpu); System.out.println("Memory: " + memory); System.out.println("Hard Disk: " + hardDisk); System.out.println("Main Unit: " + mainUnit); System.out.println("Display: " + display); } }
abstract class ComputerBuilder { protected Computer computer = new Computer(); public abstract void buildCpu(); public abstract void buildMemory(); public abstract void buildHardDisk(); public abstract void buildMainUnit(); public abstract void buildDisplay(); public Computer getComputer() { return computer; } }
class LaptopBuilder extends ComputerBuilder { @Override public void buildCpu() { computer.setCpu("Intel i5"); } @Override public void buildMemory() { computer.setMemory("16GB"); } @Override public void buildHardDisk() { computer.setHardDisk("512GB SSD"); } @Override public void buildMainUnit() { computer.setMainUnit("Compact case"); } @Override public void buildDisplay() { computer.setDisplay("13.3 inch"); } }
class DesktopBuilder extends ComputerBuilder { @Override public void buildCpu() { computer.setCpu("Intel i7"); } @Override public void buildMemory() { computer.setMemory("32GB"); } @Override public void buildHardDisk() { computer.setHardDisk("1TB NVMe SSD"); } @Override public void buildMainUnit() { computer.setMainUnit("Mid-tower case"); } @Override public void buildDisplay() { computer.setDisplay("27 inch"); } }
class ServerBuilder extends ComputerBuilder { @Override public void buildCpu() { computer.setCpu("Intel Xeon"); } @Override public void buildMemory() { computer.setMemory("64GB ECC"); } @Override public void buildHardDisk() { computer.setHardDisk("2TB SAS"); } @Override public void buildMainUnit() { computer.setMainUnit("Rack case"); } @Override public void buildDisplay() { computer.setDisplay("None"); } }
class Director { public Computer construct(ComputerBuilder builder) { builder.buildCpu(); builder.buildMemory(); builder.buildHardDisk(); builder.buildMainUnit(); builder.buildDisplay(); return builder.getComputer(); } }
public class Client_3 { public static void main(String[] args) { Director director = new Director(); System.out.println("Laptop configuration:"); ComputerBuilder laptopBuilder = new LaptopBuilder(); Computer laptop = director.construct(laptopBuilder); laptop.showConfiguration(); System.out.println(); System.out.println("Desktop configuration:"); ComputerBuilder desktopBuilder = new DesktopBuilder(); Computer desktop = director.construct(desktopBuilder); desktop.showConfiguration(); System.out.println(); System.out.println("Server configuration:"); ComputerBuilder serverBuilder = new ServerBuilder(); Computer server = director.construct(serverBuilder); server.showConfiguration(); System.out.println(); } }
|