简单工厂模式
简单工厂模式
简单工厂模式
概念
简单工厂模式也叫静态工厂模式,理念就是创建对象:用一个工厂对象创建同一类对象的实例。
简单工厂模式(Simple Factory Pattern):定义一个工厂,它可以根据参数的不同返回不同的实例,被创建的实例通常都具有共同的方法或父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于创建型模式。
实例
场景:假如我们是一家工厂,现能生产两种产品:卡车和轮船。
ES5 实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function Factory(type) {
// 生产卡车的构造函数(流水线)
function Truck() {
this.name = '卡车';
this.deliver = function () {
console.log(`您要的【${this.name}】生产好了`);
}
}
// 生产轮船的构造函数(流水线)
function Ship() {
this.name = '轮船';
this.deliver = function () {
console.log(`您要的【${this.name}】生产好了`);
}
}
switch (type) {
case 'truck':
return new Truck(); // 返回 卡车 实例
case 'ship':
return new Ship(); // 返回 轮船 实例
default:
throw new Error('只能生产卡车和轮船两种产品');
}
}
// 需求方要生产 卡车
// 卡车实例
const truck = Factory("truck");
console.log('卡车实例:', truck);
// 交付卡车
truck.deliver(); // 您要的【卡车】生产好了
// 需求方要生产 轮船
// 轮船实例
const ship = Factory("ship");
console.log('轮船实例:', ship);
// 交付 轮船
ship.deliver(); // 您要的【轮船】生产好了
上述代码中,Factory 就是一个工厂,Factory 能生产两种产品 卡车 和 轮船,用工厂函数时,只需传递 truck 或 ship 就可获取对应的实例对象。
ES6 实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 产品基类
class Product {
constructor(name) {
this.name = name;
}
deliver() {};
}
// 卡车
class Truck extends Product {
deliver() {
console.log(`您要的【${this.name}】生产好了`);
};
}
// 轮船
class Ship extends Product {
deliver() {
console.log(`您要的【${this.name}】生产好了`);
};
}
// 工厂基类:工厂
class Factory {
// 生产哪种产品由需求方决定
static createProduct(type) {
switch (type) {
case 'truck':
return new Truck('卡车');
case 'ship':
return new Ship('轮船');
default:
throw new Error('只能生产卡车和轮船两种产品');
}
}
}
// 需求方要生产 卡车
Factory.createProduct('truck').deliver(); // 您要的【卡车】生产好了
// 需求方要生产 轮船
Factory.createProduct('ship').deliver(); // 您要的【轮船】生产好了
简单工厂,用户不需要知道具体产品的类名,只需要知道对应的参数即可,对于一些复杂的类名,可以减少用户的记忆量,同时用户无需了解这些对象是如何创建及组织的,有利于整个软件体系结构的优化。
所以,使用简单工厂,是将类的实例化交给工厂函数去做,对外提供统一的方法。在代码中 new 是一个需要慎重考虑的操作,new 出现的次数越多,代码的耦合性就越强,可维护性就越差,简单工厂,就是在上面做了一层抽象,将 new 的操作封装了起来,向外提供静态方法供用户调用,这样就将耦合集中到了工厂函数中,而不是暴露在代码的各个位置。
####
优点
- 当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
适用场景
- 正确传参,就可以获取所需要的对象,无需知道内部实现细节;
- 创建对象数量少(稳定),对象的创建逻辑不复杂;
不适用场景
- 创建的对象数量多,对象的创建逻辑复杂,导致判断逻辑臃肿,难以维护。
这时业务扩展,需要能生产飞机,那么需要怎么做呢?修改工厂基类,这违反了设计模式的**开闭原则**(Open Closed Principle),该原则是指软件应该对扩展开放,而对修改关闭。如果业务复杂一些就不合适了,而工厂方法模式就是该问题的解决方案。
开闭原则:对扩展开放,对修改封闭;增加新需求的时候,我们需要做的是增加新代码,而非去修改源码;