设计模式 - 工厂模式(设计模式介绍系列)(一)

188 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

这篇文章我们讲一下日常开发中常用到的一种设计模式:工厂模式。

一、概念

工厂模式在Java 开发中很常见,根据名字我们可以看出,它其实就是作为一个“工厂”,来创建对象

设计模式分为三大类(创建型、结构型、行为型),工厂模式属于创建型模式

工厂模式的工作流程是:

  • 定义一个创建对象的接口
  • 然后子类实现接口,然后子类自行决定实例化哪一个工厂类

总结来说就是,工厂模式让对象的创建过程延迟到子类进行。

二、代码示例

对于开发者而言,有时候文字会显得比较苍白,所以我决定将文章的结构设计成如下模式:先简单介绍一下设计模式的基本概念,然后就用实际的代码做例子,最后围绕示例代码,再对设计模式的具体实现做讲解。

下面我们来看工厂模式的代码示例。

  1. 首先定义一个接口:
public interface Person {

  void gender();

}
  1. 创建接口的实现类
public class Man implements Person{

  @Override
  public void gender() {
    System.out.println("this is a man");
  }
}
public class Woman implements Person{

  @Override
  public void gender() {
    System.out.println("this is a woman");
  }
}
  1. 创建一个工厂,用于根据指定的信息,生成不同的对象。
public class PeopleFactory 

  public Person getPerson(String personType) {
    if ("man".equals(personType)) {
      return new Man();
    } else if ("woman".equals(personType)) {
      return new Woman();
    } else {
      return null;
    }
  }
}
  1. 使用这个工厂,根据传递的类型信息来生成不同的实体对象
public class ForStaticTest {

  public static void main(String[] args) {
    PeopleFactory peopleFactory = new PeopleFactory();
    Person man = peopleFactory.getPerson("man");
    man.gender();
    Person woman = peopleFactory.getPerson("woman");
    woman.gender();
  }

最后输出结果:

this is a man
this is a woman

根据上述例子我们可以看出,使用工厂方法分为四个步骤:

  • 定义一个产品接口
  • 创建接口的实现子类
  • 根据前两步的接口和实现的子类创建工厂
  • 使用

三、工厂方法的具体分析

工厂方法的一个很明显的特点就是,我们很明确地知道我们的“产品”是什么,同时知道其对应的类型是什么。

也就是说,我们知道在什么条件下,创建什么类型的实例。同时这个条件类型和实例类型我们都是确定的。

让子类实现工厂接口,在工厂中,返回的也是一个抽象的产品。

关键代码:创建过程在其子类执行。

工厂模式的优点:

  1. 使用简单:调用者如果想创建一个对象,只要知道需要向“工厂”中传递的名称就可以了。
  2. 方便扩展:使用者如果想增加一个新的产品类型(对应上面的例子,就是新加一个接口,比如说新增一个宠物Pet 类型),只要扩展一个新的工厂类就可以了。
  3. 屏蔽细节:工厂内部的具体实现对使用者是透明的,使用者只需要知道接口如何调用即可。

工厂模式的缺点:

  1. 每次增加一个产品时,都需要增加一个具体实现子类,同时需要修改工厂。
  2. 如果要新增产品的类型(对应新增接口),那么就要新增工厂、新增接口、新增实现子类。系统中类的个数成倍增加,会增加系统的复杂度,同时也会增加了系统具体类之间的依赖。

四、总结

工厂模式有时候也叫做简单工厂模式,作为一种创建类模式,在一些需要生成复杂对象的地方,我们如果想对用户屏蔽细节,那么都可以使用工厂方法模式。

需要注意,对于复杂对象适合使用工厂模式,而对于简单对象,比如说只需要通过new 就可以完成创建的对象,就不需使用工厂模式,这样会无端增加系统复杂度。(如果使用工厂模式,最基本的就需要引入一个工厂类,然而并没有对开发带来什么方便。)

以上就是对“工厂模式”的简单介绍。当时,具体应用场景要具体分析,从而确定如何使用。