工厂方法模式
介绍
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法模式让类的实例化推迟到子类中进行。
原理
工厂方法模式的核心原理包括:
- 抽象产品:定义产品的接口
- 具体产品:实现抽象产品接口
- 抽象工厂:声明工厂方法,返回产品类型
- 具体工厂:实现工厂方法,返回具体产品实例
图示
+----------------+ +----------------+
| Product |<-------| Factory |
+----------------+ +----------------+
| + operation() | | + createProduct()|
+-------^--------+ +--------^-------+
| |
+-------+--------+ +--------+-------+
| ConcreteProduct| | ConcreteFactory|
+----------------+ +----------------+
| + operation() | | + createProduct()|
+----------------+ +----------------+
代码示例
抽象产品
public interface Product {
void operation();
}
具体产品
public class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA operation");
}
}
public class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB operation");
}
}
抽象工厂
public abstract class Factory {
// 工厂方法
public abstract Product createProduct();
// 其他业务逻辑
public void doSomething() {
Product product = createProduct();
product.operation();
}
}
具体工厂
public class ConcreteFactoryA extends Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
public class ConcreteFactoryB extends Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
客户端代码
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
factoryA.doSomething();
Factory factoryB = new ConcreteFactoryB();
factoryB.doSomething();
}
}
解决方案
应用场景
- 创建对象需要复杂逻辑:将对象创建逻辑封装在工厂中
- 客户端不关心具体产品类型:只依赖抽象接口
- 产品族扩展:当需要添加新的产品类型时,只需添加对应的具体产品和工厂类
- 延迟初始化:通过工厂方法可以实现对象的延迟创建
最佳实践
- 面向接口编程:客户端代码只依赖抽象工厂和抽象产品
- 避免过多的具体工厂类:如果产品种类过多,可以考虑使用参数化工厂方法
- 结合依赖注入:在大型应用中,使用依赖注入框架管理工厂和产品实例
- 考虑使用反射:在某些情况下,可以通过反射机制动态创建产品实例
优缺点
优点:
- 解耦客户端与具体产品实现
- 提高代码可扩展性
- 符合开闭原则
- 便于单元测试
缺点:
- 增加代码复杂度
- 可能导致类爆炸(每个产品对应一个工厂)
工具推荐
- Spring Framework:通过IoC容器和工厂模式实现依赖注入
- Google Guice:提供@Provides注解实现工厂方法
- AutoFactory:Google开发的注解处理器,用于生成工厂类
- FactoryKit:轻量级工厂模式实现库