复杂度无法被消除,只能被转移。

简单工厂

  1. 有多处if分支判断,违背了开闭原则,但权衡扩展性和可读性,在大多数场景下是没问题的。
  2. 可复用的对象,可以使用容器的方式提前创建好,获取的时候直接获取即可,也减少了多处if分支。

    工厂方法

  3. 工厂方法在简单工厂基础上,再次抽象,更加符合开闭原则。

  4. 但是无法解决工厂的工厂的创建方式,又回到了简单工厂的创建方式。
  5. 增加了类的数量

    抽象工厂

  6. 不常用,基本可以忘掉。

  7. 适用于创建配套的对象场景,同一个工厂,生产多个配套的对象。
  8. 减少类的数量。

    使用场景

  9. 对象创建比较简单则直接使用简单工厂即可。

  10. 对象创建逻辑比较复杂,不只是简单的new一下,而是需要组合其他对象封装,则适合使用工厂方法的方式,进一步封装。

    参考标准

  11. 封装变化:创建对象逻辑变更对调用者透明

  12. 代码复用:创建代码抽离之后可以复用
  13. 隔离复杂性:封装复杂的创建逻辑,调用者无需了解如何创建对象。
  14. 控制复杂度:创建代码抽离,让原本的函数或类指责更单一,代码更简洁。

    如何设计一个DI框架

    配置解析

    通过外部配置的方式,配置创建对象所需的依赖,设计配置解析模块把配置解析为对象创建所需的元数据

    对象创建

    使用反射的方式,根据配置解析出的元数据创建对象。

    生命周期管理

    在对象创建的流程中植入生命周期管理,增加扩展点。

    使用Spring IOC封装工厂

  15. 定义接口

  16. 多个实现,多个实现的bean名称和类型相匹配
  17. 使用IOC注入方式注入多种实现
  18. 根据入参类型直接获取具体实现(类似简单工厂的带缓存方式)