java 工厂模式
## 一、什么是工厂模式?
**工厂模式(Factory Pattern)** 是一种创建型设计模式,主要用于将对象的创建和使用分离。它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式让一个类的实例化延迟到其子类。
### 主要作用
- 解耦对象的创建和使用
- 便于扩展和维护
- 提高代码的灵活性和可复用性
---
## 二、工厂模式的分类
1. **简单工厂模式(Simple Factory)**
由一个工厂类根据参数决定创建哪一种产品类的实例。
2. **工厂方法模式(Factory Method)**
定义一个创建对象的接口,让子类决定实例化哪一个类。
3. **抽象工厂模式(Abstract Factory)**
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
---
## 三、简单代码示例
### 1. 简单工厂模式
```java
// 产品接口
public interface Product {
void use();
}
// 具体产品A
public class ProductA implements Product {
public void use() {
System.out.println("使用产品A");
}
}
// 具体产品B
public class ProductB implements Product {
public void use() {
System.out.println("使用产品B");
}
}
// 工厂类
public class SimpleFactory {
public static Product createProduct(String type) {
if ("A".equals(type)) {
return new ProductA();
} else if ("B".equals(type)) {
return new ProductB();
}
throw new IllegalArgumentException("未知产品类型");
}
}
// 使用
public class Client {
public static void main(String[] args) {
Product product = SimpleFactory.createProduct("A");
product.use();
}
}
```
### 2. 工厂方法模式
```java
// 工厂接口
public interface Factory {
Product createProduct();
}
// 具体工厂A
public class FactoryA implements Factory {
public Product createProduct() {
return new ProductA();
}
}
// 具体工厂B
public class FactoryB implements Factory {
public Product createProduct() {
return new ProductB();
}
}
// 使用
public class Client {
public static void main(String[] args) {
Factory factory = new FactoryA();
Product product = factory.createProduct();
product.use();
}
}
```
---
## 四、工厂模式和Spring的关系
在Spring框架中,**IoC容器**本质上就是一个超级工厂。
你在类上加上`@Component`、`@Service`等注解,Spring会自动帮你创建对象并管理它们的生命周期,这就是工厂模式的应用。
比如你上面代码中的这段:
```java
@Autowired
private SpringValidatorAdapter validatorAdapter;
```
Spring会自动帮你创建`SpringValidatorAdapter`对象并注入,这就是工厂模式的实际应用。
---
## 五、工厂模式的优缺点
**优点:**
- 解耦对象的创建和使用
- 易于扩展,新增产品只需增加工厂和产品类
- 代码结构清晰
**缺点:**
- 增加了系统的复杂度
- 需要额外的工厂类
---
## 六、总结
- 工厂模式是最常用的设计模式之一,广泛应用于各种框架和中间件(如Spring、MyBatis等)。
- 它让对象的创建更加灵活,便于维护和扩展。
- 在实际开发中,推荐优先使用Spring的依赖注入(IoC),它已经帮你实现了工厂模式的所有功能。