工厂方法模式(包含简单工厂和抽象工厂)
一、简单工厂模式
简单工厂模式(Simple Factory Pattern)也称为静态工厂模式,它通过一个专门的类,根据参数的不同来负责创建其他类的实例,这些被创建的实例通常都具有共同的父类。由于这种模式通常通过静态方法来实现,因此被称为静态工厂模式。
类图关系:
优点:
- 将对象的创建和对象的使用过程进行分离,降低了系统的耦合度。
- 使用者不用关注具体对象的类名称,只要知道传入参数创建什么对象即可。
缺点:
- 工厂类的扩展较困难,一旦添加新的产品类型,就必须修改工厂的创建逻辑。
- 产品类型较多时,工厂的创建逻辑可能比较复杂,一旦出错,可能导致所有产品创建失败,不利于系统维护。
应用场景:
- 在实际项目设计中,简单工厂模式应用广泛,虽然不符合开闭原则,但它仍然是一个非常实用的设计模式。
二、工厂方法模式
工厂方法模式是简单工厂模式的一个升级版本,旨在解决简单工厂模式中不符合开闭原则的问题。工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。
类图关系:
优点:
- 良好的封装性,代码结构清晰。创建一个对象,只要知道这个产品的类名或约束字符串即可,不用知道创建的具体细节,降低了模块间的耦合。
- 解决了简单工厂模式中不符合开闭原则的问题,使程序具有良好的扩展性。在增加产品的情况下,只需要扩展对应的工厂类即可。
- 工厂方法模式是典型的解耦框架。
应用场景:
- 工厂方法模式是new一个对象的替代品,在所有需要生成对象的地方都可以使用,但要慎重地考虑是否有必要增加一个工厂类进行管理,以免增加代码的复杂度。
- 需要灵活的、可扩展框架时,可以考虑采用工厂模式。
注意:虽然工厂方法模式有很多优势,但这种设计模式对于有多种分类方式的产品或具有二级分类的产品时,并不适用。
三、抽象工厂模式
抽象工厂模式是工厂方法模式的升级版本,用来解决工厂方法模式不能创建具有二级分类的产品创建这一缺陷。
类图关系:
优点:
- 解决了具有二级分类的产品的创建问题。
- 封装性良好,每个产品的实现类都不是高层模块所关心的。
缺点:
- 如果产品分类超过二级,比如为三级或更多级,抽象工厂模式会变得非常臃肿。
- 不能解决产品有多种分类、多种组合问题。
- 扩展比较困难,增加一个产品,修改的地方比较多,这有点违反了开闭原则。
应用场景:
- 抽象工厂模式使用场景非常多,比如在开发过程中,涉及到不同的操作系统时,就可以考虑使用抽象工厂模式。通过抽象工厂模式屏蔽掉操作系统对应用的影响,让不同的产品类去处理与操作系统的交互信息。
总结:
- 简单工厂模式通过静态方法创建对象,易于理解和使用,但不利于扩展和维护。
- 工厂方法模式通过接口定义创建对象的方法,让子类决定实例化哪一个类,解决了简单工厂模式不符合开闭原则的问题,具有良好的扩展性和封装性。
- 抽象工厂模式进一步解决了工厂方法模式不能创建具有二级分类的产品的问题,但增加了系统的复杂性,适用于需要创建多个相关或相互依赖对象的场景。
在实际应用中,应根据具体需求选择合适的工厂模式,以实现代码的高内聚、低耦合和易于扩展。