You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

230 lines
6.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 简单工厂模式实现
## 项目概述
本项目实现了设计模式中的**简单工厂模式Simple Factory Pattern**,这是一种创建型设计模式,用于封装对象的创建逻辑。通过工厂类集中管理对象的创建过程,客户端代码不需要直接实例化具体产品类,从而降低了系统的耦合度。
## 设计模式说明
### 简单工厂模式简介
简单工厂模式Simple Factory Pattern属于创建型模式它提供了一个创建对象的最佳方式。在简单工厂模式中我们在创建对象时不会对客户端暴露创建逻辑而是通过一个共同的接口来指向新创建的对象。
### 核心角色
1. **抽象产品Product**:定义产品的接口,是工厂方法所创建对象的超类型。
2. **具体产品Concrete Product**:实现抽象产品接口,是工厂方法创建的目标对象。
3. **工厂Factory**:负责创建具体产品实例的类,包含创建产品的逻辑。
## 类图结构
```
┌─────────────┐ ┌───────────────┐ ┌────────────────┐
│ │ │ │ │ │
│ Product │<────│ Factory │────>│ConcreteProductA│
│ (接口) │ │ (工厂类) │ │ │
│ │ │ │ └────────────────┘
└─────────────┘ └───────────────┘
^ │
│ │
│ v
┌──────────────┐ ┌────────────────┐
│ │ │ │
│ConcreteProductB│<───│ │
│ │ │ │
└──────────────┘ └────────────────┘
```
## 代码结构
```
src/
└── main/
└── java/
├── Product.java # 抽象产品接口
├── ConcreteProductA.java # 具体产品A
├── ConcreteProductB.java # 具体产品B
├── Factory.java # 工厂类
└── FactoryTest.java # 测试类
```
## 实现详情
### 1. 抽象产品接口Product.java
定义了所有产品共有的操作方法,是具体产品类必须实现的接口。
```java
package src.main.java;
/**
* 产品接口
* 定义所有产品共有的操作
*/
public interface Product {
/**
* 产品的操作方法
*/
void operation();
}
```
### 2. 具体产品实现
#### ConcreteProductA.java
```java
package src.main.java;
/**
* 具体产品A
* 实现产品接口的具体类
*/
public class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA performing operation");
}
}
```
#### ConcreteProductB.java
```java
package src.main.java;
/**
* 具体产品B
* 实现产品接口的具体类
*/
public class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB performing operation");
}
}
```
### 3. 工厂类Factory.java
```java
package src.main.java;
/**
* 工厂类
* 根据参数创建不同的具体产品实例
*/
public class Factory {
/**
* 创建产品的静态方法
* @param type 产品类型
* @return 产品实例
*/
public static Product createProduct(String type) {
if (type == null) {
return null;
}
if (type.equalsIgnoreCase("A")) {
return new ConcreteProductA();
} else if (type.equalsIgnoreCase("B")) {
return new ConcreteProductB();
}
return null;
}
}
```
### 4. 测试类FactoryTest.java
```java
package src.main.java;
/**
* 测试类
* 验证简单工厂模式的实现
*/
public class FactoryTest {
public static void main(String[] args) {
// 测试创建ConcreteProductA
Product productA = Factory.createProduct("A");
System.out.println("Testing Product A:");
productA.operation();
// 测试创建ConcreteProductB
Product productB = Factory.createProduct("B");
System.out.println("\nTesting Product B:");
productB.operation();
// 测试无效类型
Product invalidProduct = Factory.createProduct("C");
System.out.println("\nTesting Invalid Product:");
if (invalidProduct == null) {
System.out.println("Invalid product type, returned null");
}
}
}
```
## 运行程序
要运行此程序请确保您的系统已安装Java开发环境JDK然后按照以下步骤操作
1. 编译所有Java文件
```
javac src/main/java/*.java
```
2. 运行测试类:
```
java src.main.java.FactoryTest
```
3. 预期输出:
```
Testing Product A:
ConcreteProductA performing operation
Testing Product B:
ConcreteProductB performing operation
Testing Invalid Product:
Invalid product type, returned null
```
## 设计原则
本实现遵循了以下设计原则:
1. **单一职责原则SRP**:每个类都有明确的单一职责。
2. **开闭原则OCP**:对扩展开放,对修改关闭。添加新的产品只需要添加新的具体产品类和修改工厂类。
3. **依赖倒置原则DIP**:高层模块依赖抽象,不依赖具体实现。
## 简单工厂模式的优缺点
### 优点
1. 实现了对象创建和使用的分离
2. 客户端不需要知道所创建的具体产品类的类名,只需要知道参数即可
3. 通过引入配置文件,可以在不修改代码的情况下更换和添加新的产品类
### 缺点
1. 工厂类集中了所有产品的创建逻辑,职责过重
2. 当产品种类过多时,工厂类会变得非常复杂
3. 违背了开闭原则,添加新产品时需要修改工厂类
## 适用场景
1. 工厂类负责创建的对象比较少
2. 客户端只知道传入工厂类的参数,不关心如何创建对象
## 扩展建议
如果需要更灵活的工厂模式实现,可以考虑使用:
1. **工厂方法模式**:定义一个用于创建对象的接口,让子类决定实例化哪个类
2. **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类
## 总结
简单工厂模式是一种简单实用的创建型设计模式,适用于创建对象较少且变化不大的场景。通过封装对象创建逻辑,它降低了系统的耦合度,提高了代码的可维护性。