# 简单工厂模式
# 参考
# 定义
定义一个创建产品对象的接口,产品对象的实例化创建在工厂中进行。
# 应用场景
找出了有相同“特征”的产品,客户端只需根据产品的对应参数(比如名称),无需关注对象的具体创建逻辑,即可方便地创建一个产品。
比如:一个系统中用户有三种角色,都由同一个 get
接口所返回的字段 role
所判定。0、1、2,分别对应普通用户、管理员、超级管理员。
这时候可以通过工厂模式来创建具体的对象,而用户只需要传入 role
字段值即可获取对应的用户对象。
# 实现、应用思路
简单工厂,负责对象的具体实例化、创建逻辑。供外界调用,创建所需对象。
抽象产品(也可以是接口),定义了产品的具体规范,描述了产品的主要特性、功能。这是工厂模式的一大前提。
具体产品,实现了抽象产品定义的接口,是简单工厂的创建目标。
# 优点
因工厂类负责了创建对象的逻辑,所以外部可以更加方便地获取所需产品对象,无需关心创建逻辑,责职更单一。
新增产品修改工厂即可,无需修改外部业务逻辑。
# 缺点
因为工厂类负责了所有产品的创建,所以工厂类容易责职过重,产品过多的话,工厂类代码臃肿。
新增产品需要修改工厂类,违背了开闭原则。
# 代码实例
// 抽象产品
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()