设计模式 - js 工厂模式 之 简单工厂模式

413 阅读3分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

在学习中有这样一段话:在学一样东西的时候,可以按照它是什么,有什么用,优点是什么,缺点是什么,要怎么去使用,或者使用的时候要注意什么。我觉得这五部曲还是很有用的,能帮你快速掌握一个知识点

工厂模式是什么?

工厂模式的定义

定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

工厂模式的分类

按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是 简单工厂模式工厂方法模式抽象工厂模式

我们先来介绍一下 简单工厂模式

简单工厂模式

简单工厂模式 又叫 静态工厂模式 ,由一个工厂对象决定创建某一种产品对象类的实例,主要用来创建同一类对象。

简单的来说,就是简单工厂模式有一个可以创建同一个品种的工厂类,可以创建出很多相同品种的产品。

所以简单工厂模式每增加一个新的品种的产品,就需要去新增对应的工厂类,这样子就违背了 “开闭原则” ,系统会越来越复杂。

简单工厂模式的优点

  1. 工厂类中包含了需要创建哪个品种的产品的判断,使用的时候可以直接根据参数创建对应的产品。不需要知道具体产品的类名,只需要知道创建所用的参数即可。

简单工厂模式的缺点

  1. 扩展困难。一旦增加了新的产品,就需要去修改工厂的逻辑,在产品类型较多的时候,可以造成工厂过于复杂,增加维护和扩展的难度。

  2. 简单工厂模式使用了 static 方法,这样就没有办法通过继承来形成一个阶级结构。

简单工厂模式的使用

首先我们来简单模拟一个工厂类,其中工厂类要能够创建三种不同的会员对象,分别是普通会员,白银会员,黄金会员。

然后这个工厂类的参数可以在实例化的时候传递进来,分别代表了三个不同的会员身份。

工厂上需要有一个静态方法,通过参数去创建这个参数对应的工厂实例。

这样通过不同的参数创建出来的对象也就是不同的,有着他们自己的属性和方法。

class Card {
  //构造器
  constructor(opt) {
    this.name = opt.name;
    this.calculate = opt.calculate;
  }

  //静态方法
  static getInstance(role) {
    switch (role) {
      case "common":
        return new Card({
          name: "普通会员",
          calculate: (price) => {
            return price * 0.9;
          },
        });
        break;
      case "sliver":
        return new Card({
          name: "白银会员",
          calculate: (price) => {
            return price * 0.8;
          },
        });
        break;
      case "glod":
        return new Card({
          name: "黄金会员",
          calculate: (price) => {
            return price * 0.7;
          },
        });
        break;
      default:
        throw new Error("参数错误, 可选参数:common, sliver, glod");
    }
  }
}

let common = Card.getInstance("common");
console.log(common.calculate(100));  //输出90

let sliver = Card.getInstance("sliver");
console.log(sliver.calculate(100));  //输出80

let glod = Card.getInstance("glod");
console.log(glod.calculate(100));  //输出70

例子中也展示出了,不同的实例会调用他们自己的方法返回不同的结果,以上就是一个简单的简单工厂模式。

总结

从上我们也能看出,简单工厂模式适用于产品种类较少的情况,使用简单工厂模式的工厂类时,只需要传入对应的参数,不需要去关心如何创建对象的逻辑,可以很方便的创建我们需要的产品对象。本篇就介绍简单工厂模式,后面会继续介绍 工厂方法模式抽象工厂模式 ,以及他们是在简单工厂模式上做出了什么优化,解决了什么问题。