1. 简单工厂模式概述
简单工厂模式(Simple Factory Pattern)是设计模式中最基础也最常用的创建型模式之一。它通过一个工厂类来封装对象的创建过程,客户端无需知道具体类的名称,只需要知道工厂类即可获取所需对象。
这种模式的核心思想是将对象的创建与使用分离,降低系统的耦合度。在实际开发中,当需要创建多种相似对象时,简单工厂模式能够有效减少代码重复,提高系统的可维护性。
2. 简单工厂模式的结构与实现
2.1 模式结构
简单工厂模式主要包含三个角色:
- 工厂类(Factory):负责创建具体产品的实例
- 抽象产品(Product):定义产品的公共接口
- 具体产品(ConcreteProduct):实现抽象产品接口的具体类
2.2 代码实现示例
// 抽象产品 interface Product { void operation(); } // 具体产品A class ConcreteProductA implements Product { @Override public void operation() { System.out.println("执行产品A的操作"); } } // 具体产品B class ConcreteProductB implements Product { @Override public void operation() { System.out.println("执行产品B的操作"); } } // 工厂类 class SimpleFactory { public static Product createProduct(String type) { switch (type) { case "A": return new ConcreteProductA(); case "B": return new ConcreteProductB(); default: throw new IllegalArgumentException("未知的产品类型"); } } } // 客户端代码 public class Client { public static void main(String[] args) { Product productA = SimpleFactory.createProduct("A"); productA.operation(); Product productB = SimpleFactory.createProduct("B"); productB.operation(); } }3. 简单工厂模式的应用场景
3.1 适用场景分析
简单工厂模式特别适合以下情况:
- 对象创建逻辑简单:当对象的创建逻辑不复杂,且不会频繁变化时
- 客户端不关心具体实现:客户端只需要知道产品接口,不关心具体实现类
- 产品种类有限:系统中需要创建的产品种类不多,且相对固定
3.2 实际应用案例
- 日志记录器:根据配置创建文件日志或数据库日志记录器
- 数据库连接:根据配置创建MySQL、Oracle等不同数据库连接
- UI控件库:根据平台创建不同风格的按钮、文本框等控件
4. 简单工厂模式的优缺点
4.1 优点
- 封装创建过程:将对象的创建集中管理,客户端代码更简洁
- 解耦客户端与具体类:客户端只需要知道工厂类和产品接口
- 便于扩展:新增产品时只需修改工厂类,不影响现有代码
4.2 缺点
- 违反开闭原则:新增产品类型需要修改工厂类代码
- 工厂类职责过重:当产品种类很多时,工厂类会变得臃肿
- 难以扩展复杂创建逻辑:不适合需要复杂创建逻辑的场景
5. 简单工厂模式的变体与优化
5.1 使用反射优化工厂类
class ReflectiveFactory { public static Product createProduct(Class<? extends Product> clazz) { try { return clazz.getDeclaredConstructor().newInstance(); } catch (Exception e) { throw new RuntimeException("创建产品失败", e); } } }5.2 使用配置文件动态创建产品
可以通过配置文件(如properties、XML等)定义产品类型与具体类的映射关系,工厂类读取配置文件动态创建产品,这样新增产品类型时只需修改配置文件,无需修改代码。
6. 简单工厂模式与其他模式的比较
6.1 与工厂方法模式比较
简单工厂模式将创建逻辑集中在一个工厂类中,而工厂方法模式为每个产品提供一个工厂类,更符合开闭原则。
6.2 与抽象工厂模式比较
简单工厂模式关注单一产品的创建,而抽象工厂模式关注产品族的创建,后者更适合创建一系列相关或依赖的对象。
7. 实际开发中的注意事项
- 避免过度使用:当产品类型很多或创建逻辑复杂时,考虑使用工厂方法模式或抽象工厂模式
- 合理处理异常:工厂方法中应对无效的产品类型请求进行适当处理
- 考虑线程安全:如果工厂方法需要维护状态,需要考虑线程安全问题
- 命名规范:工厂类和方法命名应清晰表达其用途,如
createXxx()、getXxx()等
8. 简单工厂模式的最佳实践
- 结合依赖注入:在现代框架中,可以将工厂类注册为Bean,通过依赖注入使用
- 使用枚举管理产品类型:避免使用字符串常量,改用枚举更安全
- 添加缓存机制:对于创建成本高的对象,可以在工厂中添加缓存
提示:在实际项目中,简单工厂模式常与其他模式结合使用,如单例模式(将工厂实现为单例)、策略模式(工厂创建不同的策略对象)等。