简单工厂模式

创建型模式概述

在提及简单工厂模式之前,我们需要先关注创建型模式这个概念。

创建型模式(Creational Pattern)关注对象的创建过程。创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离,对用户隐藏了类的实例的创建细节。创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。

以下是一些属于创建型模式的设计模式:

简单工厂模式概述

简单工厂模式的定义:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

  • 在简单工厂模式中用于创建实例的方法通常是静态(static)方法,因此又被称为静态工厂方法(Static FactoryMethod)模式;
  • 要点:如果需要什么,只需要传入一个正确的参数,就可以获取所需要的对象,而无须知道其创建细节。

简单工厂模式基本实现流程

  • 具体产品类:将需要创建的各种不同产品对象的相关代码封装到具体产品类中。
  • 抽象产品类:将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中。
  • 工厂类:提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入参数的不同创建不同的具体产品对象。
  • 客户端:只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。

简单工厂模式的结构与实现

简单工厂模式包含以下3个角色:

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

典型的抽象产品类代码:

public abstract class Product {
 //所有产品类的公共业务方法
 public void methodSame() {
 //公共方法的实现
 }
 //声明抽象业务方法
 public abstract void methodDiff();
}

典型的具体产品类代码:

public class ConcreteProduct extends Product{
 //实现业务方法
 public void methodDiff() {
 //业务方法的实现
 }
}

典型的工厂角色类代码:

public class Factory {
 //静态工厂方法
 public static Product getProduct(String arg) {
 Product product = null;
 if (arg.equalsIgnoreCase("A")) {
 product = new ConcreteProductA();
 //初始化设置product
 }
 else if (arg.equalsIgnoreCase("B")) {
 product = new ConcreteProductB();
 //初始化设置product
 }
 return product;
 }
}

典型的客户端代码:

public class Client {
 public static void main(String args[]) {
 Product product; 
 product = Factory.getProduct("A"); //通过工厂类创建产品对象 product.methodSame();
 product.methodDiff();
 }
}

何时不需要工厂?

  • 无须为系统中的每一个类都配备一个工厂类;
  • 如果一个类很简单,而且不存在太多变化,其构造过程也很简单,此时就无须为其提供工厂类,直接在使用之前实例化即可;
  • 否则会导致工厂泛滥,增加系统的复杂度;
  • 例如:java.lang.String。

简单工厂模式的简化将抽象产品类和工厂类合并,将静态工厂方法移至抽象产品类中。客户端可以通过调用产品父类的静态工厂方法,根据参数的不同创建不同类型的产品子类对象,这种做法在很多类库和框架中也广泛存在。

模式适用环境

  • 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  • 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

发表回复

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.