##查看代码:
个人感悟:
- 设计模式都是处理复杂问题的,如果问题本身很简单,使用设计模式反而累赘,增加了开发的复杂性
- 遇到最简单的情况,直接 new
- 如果创建对象的过程简单(比如封装一些页面需要展示用的对象,数据来源可能来自不同的地方,可以考虑在构造方法中封装;再比如导出到excel的对象封装),但是需要匹配不同情况,返回不同对象时:考虑使用简单工厂
- 如果遇到对象创建过程复杂(比如数据库连接这样的复杂对象,不仅仅牵涉到new 一个对象这么简单),这样需要把创建过程抽象出来,统一编写,对外提供干净的接口调取即可:考虑使用工厂模式
- 如果遇到对象创建过程复杂、而且多对象匹配问题(比如默认去缓存库redis取,如果缓存库娶不到,去oracle数据库取),在上一条我们已经把redis、oracle的创建做成了工厂,此时需要对二者统一再抽象一层:考虑使用抽象工厂
- 另外,类似汽车的建造也可以理解为抽象工厂模式,因为每个零件,比如轮胎、发动机等的建造都是复杂的过程,都可以是工厂模式去实现创建过程,生产整个汽车在工厂模式(可能已经是抽象工厂模式)上面再做一层抽象
简单工厂模式(Factory)
- 做静态工厂方法(StaticFactory Method)模式,但不属于23 种设计模式之一
- 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类
- Spring 中的BeanFactory 就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean 对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定
工厂方法模式(Factory Method)
应用场景:
- 通常由应用程序直接使用new 创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象
- 一般情况下,应用程序有自己的工厂对象来创建Bean
- 如果将应用程序自己的工厂对象交给Spring 管理,那么Spring 管理的就不是普通的Bean,而是工厂Bean
- 工厂生产相应的产品
抽象工厂模式
- 何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品
- 如何解决:在一个产品族里面,定义多个产品。每个具体的工厂负责一个产品族。抽象工厂的返回值为最高级抽象产品
非常适合解决两个维度的组合产品的构造问题,取其中一个维度作为产品族,另外一个维度作为产品族中具体的多个产品