
本文共 2410 字,大约阅读时间需要 8 分钟。
工厂方法模式和简单工厂模式:细节对比与扩展
简单工厂模式与工厂方法模式在设计模式中经常被混淆。让我们通过一个常见的计算器运算例子来分析这两种模式的不同特点。
简单工厂模式
简单工厂模式(Simple Factory Pattern)的特点是将对象的创建逻辑封装在一个工厂类中。该模式的优点在于实现了对对象创建逻辑的集中管理。通过向工厂类传递一个运算符,工厂类将根据运算符调用对应的算法类来生成运算对象。
工厂类实现:
public class OperationFactory { public static Operation createOperation(String operate) { Operation mOperation = null; switch (operate) { case "+": mOperation = new OperationAdd(); break; case "-": mOperation = new OperationSub(); break; case "*": mOperation = new OperationMul(); break; case "/": mOperation = new OperationDiv(); break; default: throw new IllegalArgumentException("未知操作'); } return mOperation; }}
客户端调用:
Operation oper = OperationFactory.createOperation("+");oper.Number1 = 100;oper.Number2 = 200;double result = oper.getResult();
工厂方法模式
工厂方法模式(Factory Method Pattern)则将对象的创建抽象成一个接口,客户端只需要调用接口的方法来获得所需的对象类型。这一层面向接口,无论是工厂类还是具体的工厂实现类,客户端都只依赖于接口,而不依赖于具体实现。
工厂接口:
public interface IFactory { Operation createOperation();}
具体工厂实现:
分别在各个运算类型下创建对应的工厂类:
public class AddFactory implements IFactory { public Operation createOperation() { return new OperationAdd(); }}
public class SubFactory implements IFactory { public Operation createOperation() { return new OperationSub(); }}
public class MulFactory implements IFactory { public Operation createOperation() { return new OperationMul(); }}
public class DivFactory implements IFactory { public Operation createOperation() { return new OperationDiv(); }}
客户端调用:
IFactory operFactory = new AddFactory();Operation oper = operFactory.createOperation();oper.Number1 = 100;oper.Number2 = 200;double result = oper.getResult();
两者的对比
简单工厂模式的优点在于代码实现简单,适合有限的运算类型场景。但当需要增加新的运算类型(如开根号),就必须修改工厂类中的逻辑,而这一修改会影响到所有使用方,违反了开放-封闭原则。
工厂方法模式通过定义一个工厂接口和多个具体工厂类的实现,分离了对象创建与具体实现。新增运算类型只需添加新的工厂类,就可以完全不影响现有系统,这完全符合开放-封闭原则。
- 依赖类型差异:
- 设计维度上的区别:
简单工厂模式的客户端代码需要直接调用工厂类的静态方法,这种耦合度较高,违背了依赖注入的原则。而工厂方法模式通过接口定义,使得客户端只依赖于抽象接口,这更符合依赖注入的理念。
简单工厂模式通常涉及单个工厂类,而工厂方法模式允许多个工厂类共存,并且能够通过接口扩展性更强。这种设计使得系统能够在不影响已有代码的前提下,轻松扩展新的功能模块。
优势对比
简单工厂模式的优点在于实现简单,适合小型应用。而工厂方法模式则提供了更高的扩展性,对于需要频繁扩展功能的系统,后者更为合适。
在实际开发中,很多框架都采用了工厂方法模式,如Spring的FactoryBean、Guice的@Provides等。它们都通过工厂接口和工厂符合标准,实现了灵活的对象创建和依赖注入。
发表评论
最新留言
关于作者
