从JDK中学习设计模式——简单工厂模式

535 阅读3分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

概述

简单工厂模式(Simple Factory Pattern)属于创建型模式,创建实例的方法通常为静态方法,因此又被称为静态工厂方法(Static Factory Method)

简单工厂模式就是工厂类根据不同的参数创建不同的实例。例如:张三开了一家水壶制造厂,当客户需要某种水壶时,客户不需要知道水壶是如何生产的,只需要告诉张三自己的水壶类型,就可以得到自己想要的水壶了。水壶制造厂就是工厂(Factory),客户告知的水壶类型就是参数,水壶制造厂生产出来的水壶就是产品(Product)。

注意:

  1. 工厂中创建实例的方法通常为静态方法,但也可以不是。
  2. 被创建的实例通常都具有共同的父类,但也可以省略。
  3. 简单工厂模式,并不属于 GoF(Gang of Four) 中的设计模式,可能是因为它违反了开闭原则吧。

结构

简单工厂模式UML图.png

  • Factory:工厂类,简单工厂模式的核心,负责创建具体的产品,该方法供外部直接调用。可将其与抽象产品类合并,但不建议。
  • Product:抽象产品类,在 Java 中为接口或抽象类,是所有具体产品的父类,用于描述具体产品的共有属性,可被省略,但不建议。
  • ConcreteProduct:具体产品类,它是工厂类要的创建目标,需要实现抽象产品类所定义的抽象方法。

优点

  1. 免除了客户端直接创建具体的产品。因为工厂类中包含的逻辑判断,可以决定在什么时候创建哪一个具体的产品实例。
  2. 客户端只需要告知需求(参数),不需要知道创建具体产品的细节(具体产品的类名)。
  3. 通过引入配置文件,在不修改客户端的情况下更换和添加新的具体产品类。

缺点

  1. 工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统都会受到影响。
  2. 会增加系统中类的个数(工厂类和抽象产品类),增加了系统的复杂度和理解难度,这也是设计模式的通病。
  3. 系统扩展困难,违反了开闭原则,一旦需要增加新产品,就不得不修改工厂类的逻辑,在产品类型较多时,会造成逻辑过于复杂。
  4. 工厂类中创建实例的方法通常为静态方法,无法形成基于继承的等级结构。

应用场景

  1. 工厂类负责创建对的对象较少;
  2. 客户端只知道传入工厂类的参数,对如何创建对象不关心。

JDK 中的应用

简单工厂模式在 JDK 源码中无处不在,例如:java.util.Calendar。

DateFormat 就是工厂类,它与抽象产品类进行了合并,其具体产品类包括 BuddhistCalendar、JapaneseImperialCalendar、GregorianCalendar。

Calendar简单工厂模式.png