设计模式之(2)——工厂方法模式

  • 定义:工厂方法模式又称为工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类来定义创建对象的接口,而子类负责生成具体的对象;
  • 主要作用:将类的实例化延迟到工厂类的子类中进行,由子类来决定该实例化哪一个类;
  • 解决的问题:上篇简单工厂设计模式中我们提到,工厂一旦需要生产新产品就需要修改简单工厂类的方法逻辑,这违反了程序设计的”开闭原则”,同时所有产品的创建都依赖一个同一个工厂类,这也与程序设计的”单一职责”相悖,如果这个类出现了问题,则有可能造成整个系统的瘫痪,所以我们的工厂方法模式就应运而生了;
  • *UML类图:

角色组成:

1、抽象产品(Product):具体产品的父类,主要描述具体产品的公共接口;

2、具体产品(ConcreteProduct):抽象产品的子类,工厂类创建的目标对象;

3、抽象工厂(Creator):具体工厂的父类,定义具体工厂中的公共接口;

4、具体工厂(ConcreteCreator):抽象工厂的子类,被外界调用,实现工厂方法创建具体产品的实例;

使用步骤:

1、创建抽象产品类,定义具体产品的一些公共接口;

2、定义具体产品类,继承抽象产品,定义生产的具体产品;

3、定义抽象工厂类,定义工厂类的生产产品的方法;

4、定义具体工厂类,继承抽象工厂类,定义具体生产的产品;

5、外界调用具体的工厂类的方法,从而创建不同的具体产品类的实例;

优点:

1、更加符合”开闭原则”,每增加一种新产品时,只需要增加相应的具体产品类和相应的具体工厂子类即可;

2、符合单一职责原则,每个具体的工厂类只负责创建一种对应的产品;

3、不使用静态工厂方法,可以形成基于继承的等级结构;

4、工厂方法模式在保留了简单工厂模式封装优点的同时,让扩展变得更简单,让继承变得可行;

缺点:

1、增加新产品时,除了新增加产品类之外,还要提供与之对应的工厂类,会造成系统中类的数目急剧膨胀,一定程度上增加了系统的复杂度,会给系统诸如类加载等等带来一些额外的开销;

2、考虑到系统的扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,在实现的时候可能需要用到DOM、反射等技术,增加了系统的实现难度;

3、一个具体工厂只能创建一种或者某种具体产品;

使用场景:

1、当一个类不知道他所需要对象的类时,工厂方法模式中,客户端不需要知道具体产品的类名,只需要知道其所对应的工厂即可;

2、当一个类希望通过子类来指定创建对象时,对于抽象工厂类只需要提供一个创建产品方法的定义,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏替换原则,在程序运行时,子类对象覆盖父类对象,从而使系统更容易扩展;

3、将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用的时候无需关心是哪一个类创建的具体的产品类,需要时再动态指定,可以将具体工厂类的名称存储在配置文件或者数据库中来实现;

Original: https://www.cnblogs.com/wha6239/p/16631228.html
Author: 一只烤鸭朝北走
Title: 设计模式之(2)——工厂方法模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612878/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球