JavaScript工厂方法模式详解:从简单工厂到静态工厂

作者:函数茶馆

时间:2026-10-28

浏览:288

本文深入解析JavaScript中的工厂方法模式,涵盖简单工厂、多工厂方法及静态工厂三种实现方式。通过邮件与短信发送示例,对比各模式在类型校验、实例化开销及调用便捷性上的差异,帮助开发者根据实际需求选择最优的对象创建策略。

文章目录

简单工厂模式实现

1. 简单工厂模式

核心思路是构建一个工厂类,负责创建实现同一接口的具体对象。

鉴于JavaScript语言特性中缺乏严格的接口概念,此处省略接口层;但需确保各实现类的成员变量与方法签名保持一致。

以下以短信发送与邮件发送为例进行说明。

1>. 邮件发送[实现]类

代码如下:

function MailSender() {
this.to = '';
this.title = '';
this.content = '';
}
MailSender.prototype.send = function() {
 //send body
}

2>. 短信发送[实现]类

代码如下:

function SmsSender() {
this.to = '';
this.title = '';
this.content = '';
}
SmsSender.prototype.send = function() {
 //send body
}

3>. 创建一个工厂类:

代码如下:

function SendFactory() {
this.sender = null;
}
SendFactory.prototype.produce = function(type) {
 var me = this;
 if (type == 'mail') {
 me.sender = new MailSender();
 } else if (type == 'sms') {
 me.sender = new SmsSender();
 }
 return me.sender;
}

4>. 使用这个工厂类:

代码如下:

var factory = new SendFactory();
var sender = factory.produce('mail'); //sms
sender.to = 'toName#mail.com';
sender.title = '邮件测试标题!';
sender.content = '发送内容';
sender.send();

多工厂方法模式优化

2. 多个工厂方法模式

说明:多个工厂方法模式是对普通工厂方法的改进。普通工厂方法依赖传入的字符串参数来返回对应实现,若参数输入错误可能导致处理失败或产生错误结果;而多个工厂方法模式通过独立的创建方法避免了此类错误。

我们对上面的工厂类进行改进:

代码如下:

function SendFactory() {
this.sender = null;
}
SendFactory.prototype.produceMail = function() {
 var me = this;
 me.sender = new MailSender();
 return me.sender;
}
SendFactory.prototype.produceSms = function() {
 var me = this;
 me.sender = new SmsSender();
 return me.sender;
}

使用方法:

代码如下:

var factory = new SendFactory();
var sender = factory.produceSms(); //produceMail
sender.to = 'toName#xxxxx';
sender.title = '短信发送方法标题';
sender.content = '发送内容';
sender.send();

静态工厂方法模式

3. 静态工厂方法模式

说明:将上面的 多个工厂方法模式 的方法改为静态标识即可,使之不必对 SendFactory 进行实例化;

将工厂类代码修改如下:

代码如下:

var SendFactory = {
produceMail : function() {
return new MailSender();
    },
produceSms : function() {
return new SmsSender();
    }
}

使用方法:

代码如下:

var sender = SendFactory.produceMail();
sender.to = 'toName#mail.com';
sender.title = '邮件发送标题';
sender.content = '发送内容';
sender.send();

模式总结与对比

工厂方法模式说明

在面向对象思想编程说明,在具有很多产品(现实世界模型,名称:类名,成员属性,及操作方法等)需要初始化,即产品需要创建,并且[实现同一接口时],可以使用工厂方法模式; 第一种模式,有输入类型错误的可能,第二模式,需要用时即创建工厂实例;

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章