|
|
|
|
@ -1,462 +1,2 @@
|
|
|
|
|
# 本项目包含以下核心内容:
|
|
|
|
|
|
|
|
|
|
# \- \*\*简单工厂模式\*\*的Java实现代码
|
|
|
|
|
|
|
|
|
|
# \- \*\*工厂方法模式\*\*的UML类图设计
|
|
|
|
|
|
|
|
|
|
# \- PlantUML使用指南和教程
|
|
|
|
|
|
|
|
|
|
# \- 完整的代码示例和测试用例
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \## 项目结构
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# ```
|
|
|
|
|
|
|
|
|
|
# ├── .trae/ # TRAE AI配置目录
|
|
|
|
|
|
|
|
|
|
# │ ├── java\_templates.json # Java代码模板配置
|
|
|
|
|
|
|
|
|
|
# │ ├── rules/ # 规则配置
|
|
|
|
|
|
|
|
|
|
# │ │ └── project\_rules.md
|
|
|
|
|
|
|
|
|
|
# │ └── trae\_config.json # 主配置文件
|
|
|
|
|
|
|
|
|
|
# ├── src/ # 源代码目录
|
|
|
|
|
|
|
|
|
|
# │ └── main/
|
|
|
|
|
|
|
|
|
|
# │ └── java/ # Java实现代码
|
|
|
|
|
|
|
|
|
|
# │ ├── Product.java # 产品接口
|
|
|
|
|
|
|
|
|
|
# │ ├── ConcreteProductA.java # 具体产品A
|
|
|
|
|
|
|
|
|
|
# │ ├── ConcreteProductB.java # 具体产品B
|
|
|
|
|
|
|
|
|
|
# │ ├── Factory.java # 简单工厂类
|
|
|
|
|
|
|
|
|
|
# │ └── Main.java # 测试主类
|
|
|
|
|
|
|
|
|
|
# ├── factory\_method\_uml.puml # 工厂方法模式UML类图
|
|
|
|
|
|
|
|
|
|
# ├── plantuml\_guide.md # PlantUML使用指南
|
|
|
|
|
|
|
|
|
|
# └── README.md # 项目说明文档
|
|
|
|
|
|
|
|
|
|
# ```
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \## 1. 简单工厂模式实现
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \### 核心组件
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \#### 1.1 产品接口 (Product.java)
|
|
|
|
|
|
|
|
|
|
# ```java
|
|
|
|
|
|
|
|
|
|
# /\*\*
|
|
|
|
|
|
|
|
|
|
# \* 产品接口
|
|
|
|
|
|
|
|
|
|
# \* 定义所有产品共有的操作方法
|
|
|
|
|
|
|
|
|
|
# \*/
|
|
|
|
|
|
|
|
|
|
# public interface Product {
|
|
|
|
|
|
|
|
|
|
# /\*\*
|
|
|
|
|
|
|
|
|
|
# \* 产品的操作方法
|
|
|
|
|
|
|
|
|
|
# \*/
|
|
|
|
|
|
|
|
|
|
# void operation();
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
# ```
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \#### 1.2 具体产品类 (ConcreteProductA.java, ConcreteProductB.java)
|
|
|
|
|
|
|
|
|
|
# ```java
|
|
|
|
|
|
|
|
|
|
# /\*\*
|
|
|
|
|
|
|
|
|
|
# \* 具体产品A类
|
|
|
|
|
|
|
|
|
|
# \* 实现产品接口的具体产品
|
|
|
|
|
|
|
|
|
|
# \*/
|
|
|
|
|
|
|
|
|
|
# public class ConcreteProductA implements Product {
|
|
|
|
|
|
|
|
|
|
# @Override
|
|
|
|
|
|
|
|
|
|
# public void operation() {
|
|
|
|
|
|
|
|
|
|
# System.out.println("ConcreteProductA operation executed");
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
# ```
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# ```java
|
|
|
|
|
|
|
|
|
|
# /\*\*
|
|
|
|
|
|
|
|
|
|
# \* 具体产品B类
|
|
|
|
|
|
|
|
|
|
# \* 实现产品接口的具体产品
|
|
|
|
|
|
|
|
|
|
# \*/
|
|
|
|
|
|
|
|
|
|
# public class ConcreteProductB implements Product {
|
|
|
|
|
|
|
|
|
|
# @Override
|
|
|
|
|
|
|
|
|
|
# public void operation() {
|
|
|
|
|
|
|
|
|
|
# System.out.println("ConcreteProductB operation executed");
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
# ```
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \#### 1.3 简单工厂类 (Factory.java)
|
|
|
|
|
|
|
|
|
|
# ```java
|
|
|
|
|
|
|
|
|
|
# /\*\*
|
|
|
|
|
|
|
|
|
|
# \* 简单工厂类
|
|
|
|
|
|
|
|
|
|
# \* 根据参数创建不同的产品实例
|
|
|
|
|
|
|
|
|
|
# \*/
|
|
|
|
|
|
|
|
|
|
# public class Factory {
|
|
|
|
|
|
|
|
|
|
# /\*\*
|
|
|
|
|
|
|
|
|
|
# \* 创建产品的静态方法
|
|
|
|
|
|
|
|
|
|
# \* @param type 产品类型
|
|
|
|
|
|
|
|
|
|
# \* @return 产品实例
|
|
|
|
|
|
|
|
|
|
# \* @throws IllegalArgumentException 当类型不支持或为空时抛出异常
|
|
|
|
|
|
|
|
|
|
# \*/
|
|
|
|
|
|
|
|
|
|
# public static Product createProduct(String type) {
|
|
|
|
|
|
|
|
|
|
# if (type == null || type.isEmpty()) {
|
|
|
|
|
|
|
|
|
|
# throw new IllegalArgumentException("Product type cannot be null or empty");
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# if (type.equalsIgnoreCase("A")) {
|
|
|
|
|
|
|
|
|
|
# return new ConcreteProductA();
|
|
|
|
|
|
|
|
|
|
# } else if (type.equalsIgnoreCase("B")) {
|
|
|
|
|
|
|
|
|
|
# return new ConcreteProductB();
|
|
|
|
|
|
|
|
|
|
# } else {
|
|
|
|
|
|
|
|
|
|
# throw new IllegalArgumentException("Unsupported product type: " + type);
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
# ```
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \#### 1.4 测试主类 (Main.java)
|
|
|
|
|
|
|
|
|
|
# ```java
|
|
|
|
|
|
|
|
|
|
# /\*\*
|
|
|
|
|
|
|
|
|
|
# \* 测试主类
|
|
|
|
|
|
|
|
|
|
# \* 演示简单工厂模式的使用
|
|
|
|
|
|
|
|
|
|
# \*/
|
|
|
|
|
|
|
|
|
|
# public class Main {
|
|
|
|
|
|
|
|
|
|
# /\*\*
|
|
|
|
|
|
|
|
|
|
# \* 主方法
|
|
|
|
|
|
|
|
|
|
# \* @param args 命令行参数
|
|
|
|
|
|
|
|
|
|
# \*/
|
|
|
|
|
|
|
|
|
|
# public static void main(String\[] args) {
|
|
|
|
|
|
|
|
|
|
# try {
|
|
|
|
|
|
|
|
|
|
# // 测试创建产品A
|
|
|
|
|
|
|
|
|
|
# Product productA = Factory.createProduct("A");
|
|
|
|
|
|
|
|
|
|
# productA.operation();
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# // 测试创建产品B
|
|
|
|
|
|
|
|
|
|
# Product productB = Factory.createProduct("B");
|
|
|
|
|
|
|
|
|
|
# productB.operation();
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# // 测试不支持的产品类型
|
|
|
|
|
|
|
|
|
|
# System.out.println("\\n测试不支持的产品类型:");
|
|
|
|
|
|
|
|
|
|
# try {
|
|
|
|
|
|
|
|
|
|
# Product productC = Factory.createProduct("C");
|
|
|
|
|
|
|
|
|
|
# } catch (IllegalArgumentException e) {
|
|
|
|
|
|
|
|
|
|
# System.out.println("Expected exception: " + e.getMessage());
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# // 测试空参数
|
|
|
|
|
|
|
|
|
|
# System.out.println("\\n测试空参数:");
|
|
|
|
|
|
|
|
|
|
# try {
|
|
|
|
|
|
|
|
|
|
# Product productNull = Factory.createProduct("");
|
|
|
|
|
|
|
|
|
|
# } catch (IllegalArgumentException e) {
|
|
|
|
|
|
|
|
|
|
# System.out.println("Expected exception: " + e.getMessage());
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# } catch (Exception e) {
|
|
|
|
|
|
|
|
|
|
# System.err.println("Unexpected error: " + e.getMessage());
|
|
|
|
|
|
|
|
|
|
# e.printStackTrace();
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
# }
|
|
|
|
|
|
|
|
|
|
# ```
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \## 2. 运行代码
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \### 编译和运行步骤
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# 1\. 确保已安装Java开发环境(JDK)
|
|
|
|
|
|
|
|
|
|
# 2\. 打开命令行工具,导航到项目根目录
|
|
|
|
|
|
|
|
|
|
# 3\. 编译Java文件:
|
|
|
|
|
|
|
|
|
|
# ```bash
|
|
|
|
|
|
|
|
|
|
# javac src\\main\\java\\\*.java
|
|
|
|
|
|
|
|
|
|
# ```
|
|
|
|
|
|
|
|
|
|
# 4\. 运行Main类:
|
|
|
|
|
|
|
|
|
|
# ```bash
|
|
|
|
|
|
|
|
|
|
# java -cp src\\main\\java Main
|
|
|
|
|
|
|
|
|
|
# ```
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \### 预期输出
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# ```
|
|
|
|
|
|
|
|
|
|
# ConcreteProductA operation executed
|
|
|
|
|
|
|
|
|
|
# ConcreteProductB operation executed
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# 测试不支持的产品类型:
|
|
|
|
|
|
|
|
|
|
# Expected exception: Unsupported product type: C
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# 测试空参数:
|
|
|
|
|
|
|
|
|
|
# Expected exception: Product type cannot be null or empty
|
|
|
|
|
|
|
|
|
|
# ```
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \## 3. 工厂方法模式UML类图
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# 项目中包含了完整的工厂方法模式UML类图定义文件:`factory\_method\_uml.puml`
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \### 类图核心特点
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \- \*\*抽象产品接口\*\* (Product):定义产品的通用操作
|
|
|
|
|
|
|
|
|
|
# \- \*\*具体产品类\*\* (ConcreteProductA, ConcreteProductB):实现抽象产品接口
|
|
|
|
|
|
|
|
|
|
# \- \*\*抽象创建者\*\* (Creator):定义工厂方法接口
|
|
|
|
|
|
|
|
|
|
# \- \*\*具体创建者\*\* (ConcreteCreatorA, ConcreteCreatorB):实现工厂方法,创建具体产品
|
|
|
|
|
|
|
|
|
|
# \- \*\*客户端\*\* (Main):只依赖抽象接口,不依赖具体实现类
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \### 运行UML类图
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# 1\. 打开 \[PlantText](https://www.planttext.com/) 在线工具
|
|
|
|
|
|
|
|
|
|
# 2\. 复制 `factory\_method\_uml.puml` 文件的内容
|
|
|
|
|
|
|
|
|
|
# 3\. 粘贴到左侧编辑区
|
|
|
|
|
|
|
|
|
|
# 4\. 点击 "Refresh" 按钮查看生成的类图
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \## 4. PlantUML使用指南
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# 项目中包含详细的PlantUML使用指南:`plantuml\_guide.md`
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \### 主要内容
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \- 在线工具访问方法
|
|
|
|
|
|
|
|
|
|
# \- 基础语法教程
|
|
|
|
|
|
|
|
|
|
# \- 类图关系表示方法
|
|
|
|
|
|
|
|
|
|
# \- 样式设置技巧
|
|
|
|
|
|
|
|
|
|
# \- IDE集成方法
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \## 5. 设计模式说明
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \### 5.1 简单工厂模式
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \*\*核心思想\*\*:由一个工厂类根据参数决定创建哪一种产品类的实例。
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \*\*优点\*\*:
|
|
|
|
|
|
|
|
|
|
# \- 实现了对象创建和使用的分离
|
|
|
|
|
|
|
|
|
|
# \- 客户端不需要知道如何创建和组装产品
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \*\*缺点\*\*:
|
|
|
|
|
|
|
|
|
|
# \- 工厂类职责过重
|
|
|
|
|
|
|
|
|
|
# \- 新增产品需要修改工厂类,违背开闭原则
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \### 5.2 工厂方法模式
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \*\*核心思想\*\*:定义一个创建产品对象的接口,但由子类决定实例化的类。工厂方法让类的实例化推迟到子类中进行。
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \*\*优点\*\*:
|
|
|
|
|
|
|
|
|
|
# \- 符合开闭原则,新增产品只需添加相应的创建者和产品类
|
|
|
|
|
|
|
|
|
|
# \- 客户端只依赖抽象接口,不依赖具体实现
|
|
|
|
|
|
|
|
|
|
# \- 更灵活的扩展性
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# \*\*适用场景\*\*:
|
|
|
|
|
|
|
|
|
|
# \- 客户端不需要知道它所需要的对象的类
|
|
|
|
|
|
|
|
|
|
# \- 系统需要在不修改现有代码的情况下扩展
|
|
|
|
|
# factory
|
|
|
|
|
|
|
|
|
|
|