简单工厂
- 有多处if分支判断,违背了开闭原则,但权衡扩展性和可读性,在大多数场景下是没问题的。
可复用的对象,可以使用容器的方式提前创建好,获取的时候直接获取即可,也减少了多处if分支。
工厂方法
工厂方法在简单工厂基础上,再次抽象,更加符合开闭原则。
- 但是无法解决工厂的工厂的创建方式,又回到了简单工厂的创建方式。
-
抽象工厂
不常用,基本可以忘掉。
- 适用于创建配套的对象场景,同一个工厂,生产多个配套的对象。
-
使用场景
对象创建比较简单则直接使用简单工厂即可。
对象创建逻辑比较复杂,不只是简单的new一下,而是需要组合其他对象封装,则适合使用工厂方法的方式,进一步封装。
参考标准
封装变化:创建对象逻辑变更对调用者透明
- 代码复用:创建代码抽离之后可以复用
- 隔离复杂性:封装复杂的创建逻辑,调用者无需了解如何创建对象。
控制复杂度:创建代码抽离,让原本的函数或类指责更单一,代码更简洁。
如何设计一个DI框架
配置解析
通过外部配置的方式,配置创建对象所需的依赖,设计配置解析模块把配置解析为对象创建所需的元数据
对象创建
生命周期管理
使用Spring IOC封装工厂
定义接口
- 多个实现,多个实现的bean名称和类型相匹配
- 使用IOC注入方式注入多种实现
- 根据入参类型直接获取具体实现(类似简单工厂的带缓存方式)