新闻中心
JS设计模式:单例模式与工厂模式实现
单例模式确保类仅有一个实例并提供全局访问,常用于共享资源管理;工厂模式则通过封装对象创建过程实现解耦,便于扩展不同类型对象的生成;二者结合可提升代码的可维护性与灵活性。

单例模式和工厂模式是J*aScript中常用的两种设计模式,它们分别解决对象创建过程中的不同问题。单例模式确保一个类只有一个实例,并提供全局访问点;工厂模式则封装对象的创建过程,使代码更灵活、可扩展。
单例模式:保证唯一实例
单例模式的核心是:无论调用多少次构造函数,都只返回同一个实例。这在需要共享资源时非常有用,比如全局配置、日志管理器或数据库连接池。
实现方式通常使用闭包或ES6的模块机制来控制实例的创建与访问。
基本实现(闭包 + 静态变量):
class Singleton {
constructor() {
if (Singleton.instance) {
return Singleton.instance;
}
this.data = 'I am the only instance';
Singleton.instance = this;
return this;
}
getData() {
return this.data;
}
}
// 使用示例
const instance1 = new Singleton();
const instance2 = new Singleton();
console.log(instance1 === instance2); // true上面的实现通过检查 Singleton.instance 是否已存在,决定是否返回已有实例。这种方式简单有效,但依赖于手动维护静态属性。
更安全的实现(利用闭包隐藏实例):
const createSingleton = (function () {
let instance = null;
return function () {
if (!instance) {
instance = {
data: 'I am unique',
getData() {
return this.data;
}
};
}
return instance;
};
})();
// 使用
const s1 = createSingleton();
const s2 = createSingleton();
console.log(s1 === s2); // true这种写法将实例私有化,避免外部直接修改,增强了封装性。
工厂模式:解耦对象创建
工厂模式用于创建对象,而无需指定具体类。它把对象的创建逻辑集中在一个“工厂函数”或“工厂类”中,客户端只需传入参数即可获得所需对象。
适用于需要根据条件生成不同类型对象的场景,比如UI组件生成、消息类型处理等。
Shoping购物网源码
该系统采用多层模式开发,这个网站主要展示女装的经营,更易于网站的扩展和后期的维护,同时也根据常用的SQL注入手段做出相应的防御以提高网站的安全性,本网站实现了购物车,产品订单管理,产品展示,等等,后台实现了动态权限的管理,客户管理,订单管理以及商品管理等等,前台页面设计精致,后台便于操作等。实现了无限子类的添加,实现了动态权限的管理,支持一下一个人做的辛苦
0
查看详情
简单工厂模式(函数形式):
class Button {
render() { throw new Error('Must implement render'); }
}
class WindowsButton extends Button {
render() {
return '<button class="windows">Windows Button</button>';
}
}
class WebButton extends Button {
render() {
return '<button class="web">Web Button</button>';
}
}
// 工厂函数
function ButtonFactory(type) {
switch (type) {
case 'windows':
return new WindowsButton();
case 'web':
return new WebButton();
default:
throw new Error(`Unknown button type: ${type}`);
}
}
// 使用
const btn1 = ButtonFactory('windows');
const btn2 = ButtonFactory('web');
console.log(btn1.render()); // Windows Button
console.log(btn2.render()); // Web Button通过工厂函数,调用方不需要知道具体的子类,只需要传入类型字符串就能得到正确的对象。
工厂类模式(更结构化):
class ButtonFactory {
static create(type) {
if (type === 'windows') {
return new WindowsButton();
} else if (type === 'web') {
return new WebButton();
} else {
throw new Error('Unsupported type');
}
}
}
// 使用
const button = ButtonFactory.create('web');
console.log(button.render());工厂类更适合复杂系统,便于扩展和维护。
结合使用场景
实际开发中,可以将单例模式用于工厂本身,确保工厂也只有一个实例:
const ButtonFactorySingleton = (function () {
let instance = null;
class Factory {
create(type) {
// 同上工厂逻辑
if (type === 'windows') return new WindowsButton();
if (type === 'web') return new WebButton();
throw new Error('Invalid type');
}
}
return function () {
if (!instance) {
instance = new Factory();
}
return instance;
};
})();
// 全局唯一的工厂实例
const factory = ButtonFactorySingleton();
const another = ButtonFactorySingleton();
console.log(factory === another); // true这样既保证了对象创建的灵活性,又控制了资源使用。
基本上就这些。单例模式关注“唯一性”,工厂模式关注“创建解耦”,两者结合能提升代码的可维护性和可扩展性。
以上就是JS设计模式:单例模式与工厂模式实现的详细内容,更多请关注其它相关文章!
# 实现了
# 锦州seo排名打造企业
# 高栏港网站建设内容需求
# 外贸网站建设注意问题
# 鄂尔多斯seo优化公司
# 天津网站建设培训学校
# 嘉兴网站优化体验
# 墙绘网站建设推广
# 吴中网络营销推广运营
# 百度推广网站优化
# 大冶seo获客方案
# 如何使用
# 用它
# 只有一个
# 数据结构
# 有哪些
# 单例模式
# 管理器
# 如何实现
# 购物网
# 子类
# 简单
# 封装性
# win
# switch
# windows
# js
# java
# es6
# javascript
# js设计模式
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
BetterDiscord插件中安全更新用户简介的实践指南
在WordPress中通过REST API获取BasicAuth保护的远程文章
Linux如何构建多环境配置管理_Linux多环境配置方案
动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
苹果手机如何防止被恶意App追踪
必由学官方平台入口 必由学在线课堂登录地址
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗
微信网页版官方入口教程 微信网页版网页版快速登录步骤
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】
Discord Slash 命令响应超时问题的异步解决方案
如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
sublime怎么设置启动时打开的窗口_sublime会话管理与热退出
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
C++如何比较两个字符串_C++ string compare函数与操作符对比
拼多多赚钱渠道_拼多多收益来源
J*aScript异步迭代器_j*ascript异步遍历
J*a递归快速排序中静态变量导致数据累积问题的解决方案
在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析
淘宝网网页版登录入口 淘宝官方网页版快捷登录
DLsite中文平台入口 DLsite官网内容在线查看
没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享
NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
将HTML动态表格多行数据保存到Google Sheet的教程
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
Bing引擎入口最新2025 Bing搜索免费官方登录
在Runstone环境中高效处理TasteDive API的JSON数据
html5 app怎么运行环境_配html5 app运行环境【教程】
邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
Flexbox布局实践:实现粘性导航栏与底部固定页脚
C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图
怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】
微信客户端如何收红包_微信客户端接收红包使用教程
J*aScript DOM操作:高效清空列表元素的策略与实践
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
Angular中父组件异步更新子组件复选框状态的实践指南
随机参数递归函数的基准调用次数与时间复杂度探究
taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读


2025-11-17
浏览次数:次
返回列表