新闻中心

JS设计模式:单例模式与工厂模式实现

2025-11-17
浏览次数:
返回列表
单例模式确保类仅有一个实例并提供全局访问,常用于共享资源管理;工厂模式则通过封装对象创建过程实现解耦,便于扩展不同类型对象的生成;二者结合可提升代码的可维护性与灵活性。

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购物网源码 Shoping购物网源码

该系统采用多层模式开发,这个网站主要展示女装的经营,更易于网站的扩展和后期的维护,同时也根据常用的SQL注入手段做出相应的防御以提高网站的安全性,本网站实现了购物车,产品订单管理,产品展示,等等,后台实现了动态权限的管理,客户管理,订单管理以及商品管理等等,前台页面设计精致,后台便于操作等。实现了无限子类的添加,实现了动态权限的管理,支持一下一个人做的辛苦

Shoping购物网源码 0 查看详情 Shoping购物网源码

简单工厂模式(函数形式):

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官方性能分析工具的使用与解读 

搜索