工厂模式(Factory)
简单工厂(SimpleFactory)
定义: 定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类
**类型:**创建型
类图:

组件说明:
- Product:工厂类所创建的所有对象的父类,封装了产品对象的公共方法,所有的具体产品为其子类对象
- Apple等:工厂创建的目标,是Product的具体类
- Factory:负责创建所有产品
使用场景:
- 工厂类负责创建的对象较少,因为不会造成工厂方法中的业务逻辑过于复杂
- 客户端只知道传入工厂类的参数,对如何创建对象不关心
优点:
- 工厂类负责创建对象,可以决定在什么时候创建哪个对象,客户端免除创建产品对象的职责
- 客户端无需知道所创建具体产品的类名,只需知道参数就可以
- 可以引入配置文件,不修改客户端代码的前提下更换和具体产品类
缺点:
- 工厂类集中了所有产品类的创建,职责过重
- 使用简单工厂会增加系统中类的个数(引入新的工厂类),增加系统复杂度
- 系统扩展困难,一旦增加新产品不得不修改工厂逻辑
- 简单工厂使用了static工厂方法,造成工厂角色无法形成基于继承的等级结构
工厂方法(FactoryMehod)
**定义:**定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行
类型: 创建型
类图:

组件说明:
- Product:抽象产品类
- ConcreteProduct:具体的产品类
- Factory:抽象工厂,提供抽象方法供具体工厂实现
- ConcreteFactory:具体工厂类,提供具体的工厂
使用场景:
- 创建对象需要大量重复代码
- 一个类通过子类来制定创建哪个对象
- 客户端不依赖于产品类实例如何被创建的细节
优点:
- 用户只需要关注产品的对应工厂,无需关注细节
- 加入新产品符合开闭原则,提高可扩展性
缺点:
- 类的个数容易过多,增加复杂度
- 增加了系统的抽象性和理解难度