he #1

Closed
px65cmfyj wants to merge 0 commits from src into main

@ -0,0 +1,61 @@
# 简单工厂模式Java实现
这是一个符合SOLID原则的简单工厂模式Java应用。
## 项目结构
```
src/
├── main/
│ └── java/
│ ├── Product.java # 抽象产品类
│ ├── ConcreteProductA.java # 具体产品类A
│ ├── ConcreteProductB.java # 具体产品类B
│ ├── Factory.java # 工厂类
│ └── Main.java # 主类,用于演示
└── test/
└── java/
├── ProductTest.java # 抽象产品测试类
├── ConcreteProductATest.java # 具体产品A测试类
├── ConcreteProductBTest.java # 具体产品B测试类
└── FactoryTest.java # 工厂类测试类
```
## 功能说明
1. **抽象产品类 (Product)**:定义产品的公共接口和抽象方法
2. **具体产品类 (ConcreteProductA, ConcreteProductB)**:实现产品的具体功能
3. **工厂类 (Factory)**:负责创建不同类型的产品实例
4. **主类 (Main)**:演示工厂模式的使用方法
## 运行方法
### 运行主程序
```bash
cd src
javac -encoding UTF-8 main/java/*.java
java main.java.Main
```
### 运行测试
使用JUnit框架运行测试
```bash
# 需要将JUnit库添加到classpath
java -cp .:junit.jar:hamcrest-core.jar org.junit.runner.JUnitCore main.java.FactoryTest main.java.ProductTest main.java.ConcreteProductATest main.java.ConcreteProductBTest
```
## SOLID原则应用
- **单一职责原则 (SRP)**:每个类都有明确的职责
- **开闭原则 (OCP)**:系统对扩展开放,对修改关闭
- **里氏替换原则 (LSP)**:子类可以替换父类使用
- **依赖倒置原则 (DIP)**:依赖于抽象而非具体实现
- **接口隔离原则 (ISP)**:产品接口简洁,只包含必要的方法
## 注意事项
- 本项目使用Java标准库实现无需额外依赖
- 测试类使用JUnit框架运行测试需要JUnit库

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

@ -0,0 +1,25 @@
package main.java;
/**
* A - (LSP)
* Product
*/
public class ConcreteProductA extends Product {
/**
* Productuse
* @return 使A
*/
@Override
public String use() {
return "Using Concrete Product A";
}
/**
* ProductgetName
* @return A
*/
@Override
public String getName() {
return "ConcreteProductA";
}
}

@ -0,0 +1,25 @@
package main.java;
/**
* B - (LSP)
* Product
*/
public class ConcreteProductB extends Product {
/**
* Productuse
* @return 使B
*/
@Override
public String use() {
return "Using Concrete Product B";
}
/**
* ProductgetName
* @return B
*/
@Override
public String getName() {
return "ConcreteProductB";
}
}

@ -0,0 +1,55 @@
package main.java;
/**
* - (OCP)(DIP)
*
*
*/
public class Factory {
// 使用常量定义产品类型,避免魔法字符串
public static final String PRODUCT_TYPE_A = "A";
public static final String PRODUCT_TYPE_B = "B";
/**
*
* @param type
* @return Product
* @throws IllegalArgumentException
*/
public static Product createProduct(String type) {
if (type == null) {
throw new IllegalArgumentException("Product type cannot be null");
}
if (PRODUCT_TYPE_A.equalsIgnoreCase(type)) {
return new ConcreteProductA();
} else if (PRODUCT_TYPE_B.equalsIgnoreCase(type)) {
return new ConcreteProductB();
} else {
throw new IllegalArgumentException("Invalid product type: " + type);
}
}
/**
*
* @param type
* @return Productnull
*/
public static Product createProductSafe(String type) {
try {
return createProduct(type);
} catch (IllegalArgumentException e) {
System.err.println("Error creating product: " + e.getMessage());
return null;
}
}
/**
*
* @param product
* @return truefalse
*/
public static boolean isValidProduct(Product product) {
return product != null;
}
}

Binary file not shown.

@ -0,0 +1,80 @@
package main.java;
/**
* - 使
*
*/
public class Main {
/**
*
* @param args
*/
public static void main(String[] args) {
System.out.println("===== 简单工厂模式演示 =====");
// 使用工厂创建产品A
try {
System.out.println("\n1. 创建并使用产品A:");
Product productA = Factory.createProduct(Factory.PRODUCT_TYPE_A);
displayProductInfo(productA);
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
// 使用工厂创建产品B
try {
System.out.println("\n2. 创建并使用产品B:");
Product productB = Factory.createProduct(Factory.PRODUCT_TYPE_B);
displayProductInfo(productB);
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
// 测试无效产品类型
try {
System.out.println("\n3. 测试无效产品类型:");
Product invalidProduct = Factory.createProduct("C");
displayProductInfo(invalidProduct);
} catch (Exception e) {
System.err.println("Expected exception: " + e.getMessage());
}
// 测试安全工厂方法
System.out.println("\n4. 测试安全工厂方法:");
Product safeProduct = Factory.createProductSafe("D");
if (safeProduct == null) {
System.out.println("安全工厂正确处理了无效产品类型");
}
// 新增测试用例:测试产品类型大小写不敏感性
try {
System.out.println("\n5. 测试产品类型大小写不敏感性:");
// 测试小写产品类型
Product productALower = Factory.createProduct("a");
System.out.println("使用小写'a'创建产品:");
displayProductInfo(productALower);
// 测试混合大小写产品类型
Product productBMixed = Factory.createProduct("B");
System.out.println("使用大写'B'创建产品:");
displayProductInfo(productBMixed);
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
System.out.println("\n===== 演示结束 =====");
}
/**
*
* @param product
*/
private static void displayProductInfo(Product product) {
if (Factory.isValidProduct(product)) {
System.out.println("产品名称: " + product.getName());
System.out.println("使用结果: " + product.use());
} else {
System.out.println("无效产品");
}
}
}

@ -0,0 +1,19 @@
package main.java;
/**
* - (SRP)
*
*/
public abstract class Product {
/**
*
* @return 使
*/
public abstract String use();
/**
*
* @return
*/
public abstract String getName();
}
Loading…
Cancel
Save