意图:在创建对象时不对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。使创建过程延迟到子类进行。
何时使用:明确地计划不同条件下创建不同实例时。
优点:

  • 用户只需关心产品对应的工厂,无需关心创建细节;
  • 加入新的产品也符合OCP,提高可扩展性。
  • 能够设计出符合依赖倒置原则(DIP)的结构

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,增加了系统的复杂度,同时也增加了系统具体类的依赖。
使用场景: 创建对象需要大量重复的代码,应用层不依赖于产品类实例如何被创建、实现等细节,一个类通过其子类来创建对象,只需要所对应的工厂,无需关心是哪个子类实现。例如:1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

实现

我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory
FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。

工厂模式 - 图1
image.png