|
|
# 简单工厂模式实现
|
|
|
|
|
|
## 项目概述
|
|
|
|
|
|
本项目实现了设计模式中的**简单工厂模式(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. **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类
|
|
|
|
|
|
## 总结
|
|
|
|
|
|
简单工厂模式是一种简单实用的创建型设计模式,适用于创建对象较少且变化不大的场景。通过封装对象创建逻辑,它降低了系统的耦合度,提高了代码的可维护性。 |