diff --git a/README/images/设计模式-v2/image-20250201203116885.png b/README/images/设计模式-v2/image-20250201203116885.png new file mode 100644 index 0000000..179ed38 Binary files /dev/null and b/README/images/设计模式-v2/image-20250201203116885.png differ diff --git a/README/设计模式-v2.md b/README/设计模式-v2.md index 81f11c4..27f6720 100644 --- a/README/设计模式-v2.md +++ b/README/设计模式-v2.md @@ -619,3 +619,169 @@ public class Main { } } ``` + +## 建造者模式 + +![image-20250201203116885](./images/设计模式-v2/image-20250201203116885.png) + +### 简单示例 + +比如我们要构建一个复杂的 `Computer`(计算机)对象。我们可以定义一个 `ComputerBuilder`,它将按顺序设置计算机的 CPU、内存、硬盘等组件,最后得到一个完整的 `Computer` 对象。 + +#### 代码示例 + +```java +public class CommandDemo { + public static void main(String[] args) { + ConcreteLowComputerBuilder concreteLowComputerBuilder = new ConcreteLowComputerBuilder(); + Director director = new Director(concreteLowComputerBuilder); + director.constructComputer(); + System.out.println(concreteLowComputerBuilder.getComputer()); + + System.out.println("\n-----------------分割线-----------------\n"); + + ConcreteHighComputerBuilder concreteHighComputerBuilder = new ConcreteHighComputerBuilder(); + director = new Director(concreteHighComputerBuilder); + director.constructComputer(); + System.out.println(concreteHighComputerBuilder.getComputer()); + } + + // 构建产品接口 + interface ComputerBuilder { + + /** + * 构建 CPU 方法 + */ + void buildCPU(); + + /** + * 构建 RAM 方法 + */ + void buildRAM(); + + /** + * 构建 磁盘 方法 + */ + void buildHardDrive(); + + /** + * 返回产品 + * + * @return Computer + */ + Computer getComputer(); + } + + // 产品类 + @Data + static class Computer { + private String CPU; + private String RAM; + private String hardDrive; + } + + // 构建低端产品 + static class ConcreteLowComputerBuilder implements ComputerBuilder { + private final Computer computer = new Computer(); + + /** + * 构建 CPU 方法 + */ + @Override + public void buildCPU() { + computer.setCPU("Low CPU"); + } + + /** + * 构建 RAM 方法 + */ + @Override + public void buildRAM() { + computer.setRAM("Low RAM"); + } + + /** + * 构建 磁盘 方法 + */ + @Override + public void buildHardDrive() { + computer.setHardDrive("Low Driver"); + } + + /** + * 返回产品 + * + * @return Computer + */ + @Override + public Computer getComputer() { + return computer; + } + } + + // 构建高端产品 + static class ConcreteHighComputerBuilder implements ComputerBuilder { + private final Computer computer = new Computer(); + + /** + * 构建 CPU 方法 + */ + @Override + public void buildCPU() { + computer.setCPU("High CPU"); + } + + /** + * 构建 RAM 方法 + */ + @Override + public void buildRAM() { + computer.setRAM("High RAM"); + } + + /** + * 构建 磁盘 方法 + */ + @Override + public void buildHardDrive() { + computer.setHardDrive("High Driver"); + } + + /** + * 返回产品 + * + * @return Computer + */ + @Override + public Computer getComputer() { + return computer; + } + } + + // 构建者 + public static class Director { + private final ComputerBuilder builder; + + public Director(ComputerBuilder builder) { + this.builder = builder; + } + + public void constructComputer() { + builder.buildCPU(); + builder.buildRAM(); + builder.buildHardDrive(); + } + } +} +``` + +#### 运行结果 + +```java +CommandDemo.Computer(CPU=Low CPU, RAM=Low RAM, hardDrive=Low Driver) + +-----------------分割线----------------- + +CommandDemo.Computer(CPU=High CPU, RAM=High RAM, hardDrive=High Driver) +``` + diff --git a/pattern/src/main/java/cn/bunny/pattern5/demo3/CommandDemo.java b/pattern/src/main/java/cn/bunny/pattern5/demo3/CommandDemo.java new file mode 100644 index 0000000..dc57cdf --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern5/demo3/CommandDemo.java @@ -0,0 +1,146 @@ +package cn.bunny.pattern5.demo3; + +import lombok.Data; + +public class CommandDemo { + public static void main(String[] args) { + ConcreteLowComputerBuilder concreteLowComputerBuilder = new ConcreteLowComputerBuilder(); + Director director = new Director(concreteLowComputerBuilder); + director.constructComputer(); + System.out.println(concreteLowComputerBuilder.getComputer()); + + System.out.println("\n-----------------分割线-----------------\n"); + + ConcreteHighComputerBuilder concreteHighComputerBuilder = new ConcreteHighComputerBuilder(); + director = new Director(concreteHighComputerBuilder); + director.constructComputer(); + System.out.println(concreteHighComputerBuilder.getComputer()); + } + + // 构建产品接口 + interface ComputerBuilder { + + /** + * 构建 CPU 方法 + */ + void buildCPU(); + + /** + * 构建 RAM 方法 + */ + void buildRAM(); + + /** + * 构建 磁盘 方法 + */ + void buildHardDrive(); + + /** + * 返回产品 + * + * @return Computer + */ + Computer getComputer(); + } + + // 产品类 + @Data + static class Computer { + private String CPU; + private String RAM; + private String hardDrive; + } + + // 构建低端产品 + static class ConcreteLowComputerBuilder implements ComputerBuilder { + private final Computer computer = new Computer(); + + /** + * 构建 CPU 方法 + */ + @Override + public void buildCPU() { + computer.setCPU("Low CPU"); + } + + /** + * 构建 RAM 方法 + */ + @Override + public void buildRAM() { + computer.setRAM("Low RAM"); + } + + /** + * 构建 磁盘 方法 + */ + @Override + public void buildHardDrive() { + computer.setHardDrive("Low Driver"); + } + + /** + * 返回产品 + * + * @return Computer + */ + @Override + public Computer getComputer() { + return computer; + } + } + + // 构建高端产品 + static class ConcreteHighComputerBuilder implements ComputerBuilder { + private final Computer computer = new Computer(); + + /** + * 构建 CPU 方法 + */ + @Override + public void buildCPU() { + computer.setCPU("High CPU"); + } + + /** + * 构建 RAM 方法 + */ + @Override + public void buildRAM() { + computer.setRAM("High RAM"); + } + + /** + * 构建 磁盘 方法 + */ + @Override + public void buildHardDrive() { + computer.setHardDrive("High Driver"); + } + + /** + * 返回产品 + * + * @return Computer + */ + @Override + public Computer getComputer() { + return computer; + } + } + + // 构建者 + public static class Director { + private final ComputerBuilder builder; + + public Director(ComputerBuilder builder) { + this.builder = builder; + } + + public void constructComputer() { + builder.buildCPU(); + builder.buildRAM(); + builder.buildHardDrive(); + } + } +}