# 简单工厂模式

# 参考

  1. 简单工厂模式 (opens new window)
  2. 工厂方法模式比较 (opens new window)

# 定义

定义一个创建产品对象的接口,产品对象的实例化创建在工厂中进行。

# 应用场景

找出了有相同“特征”的产品,客户端只需根据产品的对应参数(比如名称),无需关注对象的具体创建逻辑,即可方便地创建一个产品。

比如:一个系统中用户有三种角色,都由同一个 get 接口所返回的字段 role 所判定。0、1、2,分别对应普通用户、管理员、超级管理员。 这时候可以通过工厂模式来创建具体的对象,而用户只需要传入 role 字段值即可获取对应的用户对象。

# 实现、应用思路

  1. 简单工厂,负责对象的具体实例化、创建逻辑。供外界调用,创建所需对象。

  2. 抽象产品(也可以是接口),定义了产品的具体规范,描述了产品的主要特性、功能。这是工厂模式的一大前提。

  3. 具体产品,实现了抽象产品定义的接口,是简单工厂的创建目标。

# 优点

  1. 因工厂类负责了创建对象的逻辑,所以外部可以更加方便地获取所需产品对象,无需关心创建逻辑,责职更单一。

  2. 新增产品修改工厂即可,无需修改外部业务逻辑。

# 缺点

  1. 因为工厂类负责了所有产品的创建,所以工厂类容易责职过重,产品过多的话,工厂类代码臃肿。

  2. 新增产品需要修改工厂类,违背了开闭原则。

# 代码实例

// 抽象产品
interface IUser {
  hello(): void
}
// 具体产品:普通用户
class User implements IUser {
  hello() {
    console.log('I am a user.')
  }
}
// 具体产品:管理员
class Admin implements IUser {
  hello() {
    console.log('I am a admin.')
  }
}
// 具体产品:超级管理员
class SuperAdmin implements IUser {
  hello() {
    console.log('I am a superAdmin.')
  }
}
// 简单工厂
class UserFactory {
  create(code: number): IUser {
    switch (code) {
      case 0:
        return new User()
      case 1:
        return new Admin()
      case 2:
        return new SuperAdmin()
      default:
        throw new Error('wrong code for user.')
    }
  }
}

const userFactory = new UserFactory()
userFactory.create(0).hello()
userFactory.create(1).hello()
userFactory.create(2).hello()
上次更新: 8/8/2021, 1:29:50 AM