🍦 工厂方法模式
2022年6月20日
- 设计模式
🍦 工厂方法模式
1. 概述
1) 是什么
- 每种产品都有各自的生产工厂,当对象需要使用时,通过各自的工厂创建
- 定义了一个创建对象的接口,但由子类决定要实例化哪个类,工厂方法把实例化操作推迟到子类
- 一个工厂只能生产一种具体产品
- 客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可,消费者无须修改就可以接纳新产品
2) 优点
- 符合单一职责,一个类或方法只负责一件事
- 符合开闭原则,对扩展开放,对修改关闭,每种产品都有各自的工厂
- 符合迪米特原则,类与类之间没有关联,降低耦合
3) 缺点
- 当需要新增一种产品时,需要同时增加产品的具体实现 & 对应的制造工厂,产生更多的类
2. 代码示例
1) 场景 & 目标
- 一个工厂,生产 2 种产品
- 汽车
- 飞机
- 当需要汽车时,通知工厂给我生产汽车
- 当需要飞机时,通知工厂给我生产飞机
2) 简单工厂
- 简单工厂模式并不属于23种GOF设计模式之一。但是他是抽象工厂模式,工厂方法模式的基础
- 违背开闭原则:
- 当需要增加一种商品 - Ship 时,除了需要增加一个 具体产品 3
- 还需要修改简单工厂的 getProduct(String name) 方法,让其增加一种 case,违背了开闭原则
3) 工厂方法
3. 应用
1) BeanFactory
- 简单工厂模式
- 根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定
2) FactoryBean
- 实现了FactoryBean接口的bean是一类叫做factory的bean。
- 其特点是,spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这个bean.getObject()方法的返回值
3) java.util.Iterator
- 抽象产品:
- java.util.Iterator
- 具体产品1:
- ArrayListIterator
- 抽象工厂:
- java.util.Collection.iterator()
- 具体工厂1:
- ArrayList