Forráskód Böngészése

chore: add builder pattern example, tests and update README

檀烈 2 hónapja
szülő
commit
17b0da1262

+ 53 - 1
README.md

@@ -1,2 +1,54 @@
-# design-pattern
+# design-pattern - 设计模式示例集合
 
+这是一个用于学习与演示常见设计模式的 Java 示例集合(基于 Maven / Java 21)。
+
+目录结构(重要包)
+
+- `cn.qinys.learn.creational.factory` - 工厂模式示例(Factory Method)
+- `cn.qinys.learn.creational.builder` - 建造者模式示例(Builder)
+- `cn.qinys.learn.creational.singleton` - 单例模式示例(Singleton)
+
+快速开始
+
+1. 编译并运行所有测试:
+
+```powershell
+Set-Location -Path 'D:\learn\design-pattern'
+mvn test
+```
+
+2. 打包(跳过测试):
+
+```powershell
+mvn -DskipTests package
+```
+
+3. 运行演示(示例):
+
+- 运行工厂方法示例:
+
+```powershell
+java -cp target\classes;target\test-classes cn.qinys.learn.creational.factory.FactoryDemo
+```
+
+- 运行建造者示例:
+
+```powershell
+java -cp target\classes;target\test-classes cn.qinys.learn.creational.builder.BuilderDemo
+```
+
+关于示例
+
+- `factory` 包中的示例展示了工厂方法模式:抽象 `Creator` 定义 `factoryMethod()`,由具体 `Creator` 返回不同的 `Product` 实现。
+- `builder` 包中的示例展示了建造者模式:`Director` 负责组装步骤,`Builder`/`ConcreteBuilder` 提供构建细节,最后得到 `Computer` 对象。
+
+扩展与贡献
+
+如需添加更多模式(例如抽象工厂、适配器、策略等),请在 `src/main/java/cn/qinys/learn/` 下添加新的包并提交 PR。测试请放入 `src/test/java` 对应包中。
+
+如果需要,我可以:
+
+- 添加更详细的 README(每个模式的 UML 图和代码说明)
+- 添加 Gradle 构建脚本或 GitHub Actions 工作流以自动运行测试
+
+祝学习愉快!

+ 19 - 0
src/main/java/cn/qinys/learn/creational/builder/Builder.java

@@ -0,0 +1,19 @@
+package cn.qinys.learn.creational.builder;
+
+/**
+ * Builder 接口,定义构建 Product 的各个步骤
+ */
+public interface Builder {
+    Builder setCpu(String cpu);
+
+    Builder setRam(int gb);
+
+    Builder setStorage(int gb);
+
+    Builder setGpu(String gpu);
+
+    Builder setWifi(boolean wifi);
+
+    Computer build();
+}
+

+ 18 - 0
src/main/java/cn/qinys/learn/creational/builder/BuilderDemo.java

@@ -0,0 +1,18 @@
+package cn.qinys.learn.creational.builder;
+
+/**
+ * Demo 主类,演示建造者模式如何使用
+ */
+public class BuilderDemo {
+    public static void main(String[] args) {
+        Director director = new Director();
+        Builder builder = new ComputerBuilder();
+
+        Computer gaming = director.constructGamingPC(builder);
+        Computer office = director.constructOfficePC(builder);
+
+        System.out.println("Gaming PC: " + gaming);
+        System.out.println("Office PC:  " + office);
+    }
+}
+

+ 65 - 0
src/main/java/cn/qinys/learn/creational/builder/Computer.java

@@ -0,0 +1,65 @@
+package cn.qinys.learn.creational.builder;
+
+/**
+ * Product - 需要通过建造者构造的复杂对象
+ */
+public class Computer {
+    private String cpu;
+    private int ram; // GB
+    private int storage; // GB
+    private String gpu;
+    private boolean wifi;
+
+    // getters and setters
+    public String getCpu() {
+        return cpu;
+    }
+
+    public void setCpu(String cpu) {
+        this.cpu = cpu;
+    }
+
+    public int getRam() {
+        return ram;
+    }
+
+    public void setRam(int ram) {
+        this.ram = ram;
+    }
+
+    public int getStorage() {
+        return storage;
+    }
+
+    public void setStorage(int storage) {
+        this.storage = storage;
+    }
+
+    public String getGpu() {
+        return gpu;
+    }
+
+    public void setGpu(String gpu) {
+        this.gpu = gpu;
+    }
+
+    public boolean isWifi() {
+        return wifi;
+    }
+
+    public void setWifi(boolean wifi) {
+        this.wifi = wifi;
+    }
+
+    @Override
+    public String toString() {
+        return "Computer{" +
+                "cpu='" + cpu + '\'' +
+                ", ram=" + ram +
+                ", storage=" + storage +
+                ", gpu='" + gpu + '\'' +
+                ", wifi=" + wifi +
+                '}';
+    }
+}
+

+ 47 - 0
src/main/java/cn/qinys/learn/creational/builder/ComputerBuilder.java

@@ -0,0 +1,47 @@
+package cn.qinys.learn.creational.builder;
+
+/**
+ * 具体建造者,实现 Builder 接口
+ */
+public class ComputerBuilder implements Builder {
+    private Computer computer = new Computer();
+
+    @Override
+    public Builder setCpu(String cpu) {
+        computer.setCpu(cpu);
+        return this;
+    }
+
+    @Override
+    public Builder setRam(int gb) {
+        computer.setRam(gb);
+        return this;
+    }
+
+    @Override
+    public Builder setStorage(int gb) {
+        computer.setStorage(gb);
+        return this;
+    }
+
+    @Override
+    public Builder setGpu(String gpu) {
+        computer.setGpu(gpu);
+        return this;
+    }
+
+    @Override
+    public Builder setWifi(boolean wifi) {
+        computer.setWifi(wifi);
+        return this;
+    }
+
+    @Override
+    public Computer build() {
+        Computer result = this.computer;
+        // reset builder for potential reuse
+        this.computer = new Computer();
+        return result;
+    }
+}
+

+ 27 - 0
src/main/java/cn/qinys/learn/creational/builder/Director.java

@@ -0,0 +1,27 @@
+package cn.qinys.learn.creational.builder;
+
+/**
+ * Director:知道如何组合各个建造步骤来创建特定配置的产品
+ */
+public class Director {
+    public Computer constructGamingPC(Builder builder) {
+        return builder
+                .setCpu("Intel i9-14900K")
+                .setRam(32)
+                .setStorage(2000)
+                .setGpu("NVIDIA RTX 4080")
+                .setWifi(true)
+                .build();
+    }
+
+    public Computer constructOfficePC(Builder builder) {
+        return builder
+                .setCpu("Intel i5-13400")
+                .setRam(8)
+                .setStorage(512)
+                .setGpu("Integrated")
+                .setWifi(true)
+                .build();
+    }
+}
+

+ 29 - 0
src/test/java/cn/qinys/learn/creational/builder/BuilderTest.java

@@ -0,0 +1,29 @@
+package cn.qinys.learn.creational.builder;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class BuilderTest {
+
+    @Test
+    public void testDirectorBuildsExpectedComputers() {
+        Director director = new Director();
+        Builder builder = new ComputerBuilder();
+
+        Computer gaming = director.constructGamingPC(builder);
+        assertEquals("Intel i9-14900K", gaming.getCpu());
+        assertEquals(32, gaming.getRam());
+        assertEquals(2000, gaming.getStorage());
+        assertEquals("NVIDIA RTX 4080", gaming.getGpu());
+        assertTrue(gaming.isWifi());
+
+        Computer office = director.constructOfficePC(builder);
+        assertEquals("Intel i5-13400", office.getCpu());
+        assertEquals(8, office.getRam());
+        assertEquals(512, office.getStorage());
+        assertEquals("Integrated", office.getGpu());
+        assertTrue(office.isWifi());
+    }
+}
+