工厂方法模式

工厂方法模式概述

假设我们需要开发的软件中包含了不同的按钮类型,此时我们需要一个按钮工厂去生产不同类型的按钮。如果使用简单工厂模式进行设计,当面对新的需求时,比如增加一个椭圆形按钮类,我们就必须修改当前创造的按钮工厂中的源代码,这显然是违背前一部分中所提及的开闭原则的。

使用简单工厂模式设计的按钮工厂在一定程度上会违反开闭原则。

因此,我们引入工厂方法模式,使用一个抽象工厂类来生产出不同的具体工厂,再使用具体工厂类对产品进行生产。即可避免需求改变时需要修改工厂类的麻烦。

而使用工厂方法模式设计的按钮工厂则能够很好的引进新的方法。

工厂方法模式的定义:定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

  • 简称为工厂模式(Factory Pattern)。
  • 又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。
  • 工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。
  • 目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

工厂方法模式的结构与实现

工厂方法模式的结构

工厂方法模式包含以下4个角色:

  • Product(抽象产品)
  • ConcreteProduct(具体产品)
  • Factory(抽象工厂)
  • ConcreteFactory(具体工厂)

工厂方法模式的实现

与简单工厂模式相比,方法模式最重要的特点是引入了抽象工厂角色,抽象工厂可以是接口,也可以是抽象类或者具体类。

典型的抽象工厂类代码:

public interface Factory {
 public Product factoryMethod();
}

在实际使用时,具体工厂类在实现工厂方法时除了创建具体产品对象之外,还可以负责产品对象的初始化工作以及一些资源和环境配置工作,例如连接数据库、创建文件等。

典型的具体工厂类代码:

public class ConcreteFactory implements Factory {
 public Product factoryMethod() {
 return new ConcreteProduct();
 }
}

典型的客户端代码片段:

Factory factory;
factory = new ConcreteFactory(); //可通过配置文件和反射机制实现
Product product;
product = factory.factoryMethod();

工厂方法模式的优缺点与适用环境

模式优点

  • 工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节。
  • 能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。
  • 在系统中加入新产品时,完全符合开闭原则。

模式缺点

  • 系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销。
  • 增加了系统的抽象性和理解难度。

模式适用环境

  • 客户端不知道它所需要的对象的类(客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建)。
  • 抽象工厂类通过其子类来指定创建哪个对象。

发表回复

Breeze Wang

A student majoring in Software Engineering at Central South University has an understanding of software development techniques, software architecture, and is able to use Godot to develop game projects. I am currently in the Game Development Laboratory at Central South University. I have experience participating in Global Game Jam. Loving game development.