目录
Factory Method(工厂方法,Creational Pattern)
问题:"new"关键字的问题
- 当我们使用new创建一个新的对象时,我们实际上初始化了一个实体类,而非使用一个接口
- 此外当我们使用了一组相关的实体类时,我们会这样写
- 这样的代码在需要修改和扩展时不够灵活,需要重新修改它们
- 我们希望使用接口使程序灵活
- 比如一个客户去了全聚德吃烤鸭,不能让他自己new一个烤鸭上来,而要让他自己有一个厨师接口,调用饭店里具体的厨师来上菜
Factory Method
- 定义一个创建对象的接口,由实现接口的类来决定具体实例化哪个对象
- 也叫做虚拟构造器Virtual Constructor
啥时用
- 实体产品类不需要暴露给客户时
- 创造者无法决定必须创造的具体产品
- 创造者想要它的子类来指定它创造的产品
- 创建者将创建实例的责任委托给几个子类
怎么用
- Product是工厂创建的产品的接口
- ConcreteProduct实现Product接口
- Creator声明一个工厂方法,返回一个Product对象
- ConcreteCreator重写工厂方法,返回ConcreteProduct的实例
优缺点
- 优点:
- 把所有new放在一个对象或方法里面,避免了代码里面的重复,而且提供了一个执行维护的地方
- 客户端仅依赖于接口而不是具体类来实例化对象
- 缺点:
- 客户必须有一个创建者类的子类才能实例化一个具体的对象
实现细节
- Creator可以是抽象的也可以是具体的,如果是具体的,应该实现一个默认的工厂方法
- 工厂方法要有参数,工厂方法通过参数来实例化不同的对象
变种
简单工厂
静态工厂
- 这里的工厂方法是静态的,不必再实例化对象
实例:Spring中的BeanFactory,依赖注入
- 理解依赖注入:本来我接受各种参数来构造一个对象,现在只接受一个参数——已经实例化的对象。
- 可以参考:
- https://www.qikegu.com/docs/1541
- 如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的? - Angry Bugs的回答 - 知乎
https://www.zhihu.com/question/32108444/answer/581948457
- 依赖注入的三种方式
- 构造器注入
- setter注入
- 接口注入