简单工厂
定义
由一个工厂对象决定创建出哪一种产品类的实例
又称为静态方法模式(创建型,但是不属于GOF23种设计模式)
现实生活中,工厂是负责生产产品的;同样,在设计模式种,简单工厂模式我们可以理解为是负责生产对象的一个类,称为”工厂类“
解决的问题
将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。
即使用者可直接消费产品而不需要知道其生产的细节
模式原理
模式组成
组成(角色) | 关系 | 作用 |
---|---|---|
抽象产品(Product) | 具体产品的父类 | 描述产品的公共接口 |
具体产品(Concrete Product) | 抽象产品的子类;工厂类创建的目标类 | 描述生产的具体产品 |
工厂(Creator) | 被外界调用 | 根据传入不同参数从而创建不同具体产品类的实例 |
UML类图
使用步骤:
- 创建抽象产品类,定义具体产品的公共接口
- 创建具体产品类(继承抽象产品类)
- 创建工厂类,创建静态方法,方法根据传入不同参数从而创建不同具体产品类的实例
- 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
优点
- 将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
- 把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。
缺点
- 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
- 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
- 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。
实例
实例背景
- 背景:小成有一个塑料生产厂,用来做塑料加工生意
- 目的:最近推出了3个产品,小成希望使用简单工厂模式实现3款产品的生产
实现步骤:
步骤1、创建抽象产品类
1 | //抽象产品类 |
步骤2、创建具体产品类(继承抽象产品类),定义生产的具体产品
1 | //具体产品类A |
步骤3. 创建工厂类,通过创建静态方法从而根据传入不同参数创建不同具体产品类的实例
1 | class Factory { |
步骤4. 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
1 | //工厂产品生产流程 |
输出结果:
1 | 生产出了产品A |
参考:
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/06/designPattern/2020-03-06-simpleFactory/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!