「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」
在学习中有这样一段话:在学一样东西的时候,可以按照它是什么,有什么用,优点是什么,缺点是什么,要怎么去使用,或者使用的时候要注意什么。我觉得这五部曲还是很有用的,能帮你快速掌握一个知识点
工厂模式是什么?
工厂模式的定义
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
工厂模式的分类
按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是 简单工厂模式 、工厂方法模式 和 抽象工厂模式 。
我们先来介绍一下 简单工厂模式 。
简单工厂模式
简单工厂模式 又叫 静态工厂模式 ,由一个工厂对象决定创建某一种产品对象类的实例,主要用来创建同一类对象。
简单的来说,就是简单工厂模式有一个可以创建同一个品种的工厂类,可以创建出很多相同品种的产品。
所以简单工厂模式每增加一个新的品种的产品,就需要去新增对应的工厂类,这样子就违背了 “开闭原则” ,系统会越来越复杂。
简单工厂模式的优点
- 工厂类中包含了需要创建哪个品种的产品的判断,使用的时候可以直接根据参数创建对应的产品。不需要知道具体产品的类名,只需要知道创建所用的参数即可。
简单工厂模式的缺点
-
扩展困难。一旦增加了新的产品,就需要去修改工厂的逻辑,在产品类型较多的时候,可以造成工厂过于复杂,增加维护和扩展的难度。
-
简单工厂模式使用了 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
例子中也展示出了,不同的实例会调用他们自己的方法返回不同的结果,以上就是一个简单的简单工厂模式。
总结
从上我们也能看出,简单工厂模式适用于产品种类较少的情况,使用简单工厂模式的工厂类时,只需要传入对应的参数,不需要去关心如何创建对象的逻辑,可以很方便的创建我们需要的产品对象。本篇就介绍简单工厂模式,后面会继续介绍 工厂方法模式 和 抽象工厂模式 ,以及他们是在简单工厂模式上做出了什么优化,解决了什么问题。