独一无二:探索单例模式的现代化创造之道

简介: 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。

⭐  专栏简介


       欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。



       同时,我们也会关注最新的前端趋势和发展动态。随着Web技术的不断演进,前端开发也在不断推陈出新。我们会及时介绍最新的前端框架、工具和技术,使你能够站在前沿,与时俱进。通过掌握最新的前端技术,你将能够在竞争激烈的Web开发领域中有更大的竞争力。



📘  文章引言


一、单例模式是什么


单例模式(Singleton Pattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建


在应用程序运行期间,单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单例对象,


从定义上来看,全局变量好像就是单例模式,但是一般情况我们不认为全局变量是一个单例模式,原因是:


全局命名污染

不易维护,容易被重写覆盖


二、实现


在javascript中,实现一个单例模式可以用一个变量来标志当前的类已经创建过对象,如果下次获取当前类的实例时,直接返回之前创建的对象即可,如下:


// 定义一个类
function Singleton(name) {
  this.name = name;
  this.instance = null;
}
// 原型扩展类的一个方法getName()
Singleton.prototype.getName = function() {
  console.log(this.name)
};
// 获取类的实例
Singleton.getInstance = function(name) {
  if(!this.instance) {
      this.instance = new Singleton(name);
  }
  return this.instance
};
// 获取对象1
const a = Singleton.getInstance('a');
// 获取对象2
const b = Singleton.getInstance('b');
// 进行比较
console.log(a === b);
使用闭包也能够实现,如下:
function Singleton(name) {
  this.name = name;
}
// 原型扩展类的一个方法getName()
Singleton.prototype.getName = function() {
  console.log(this.name)
};
// 获取类的实例
Singleton.getInstance = (function() {
  var instance = null;
  return function(name) {
      if(!this.instance) {
          this.instance = new Singleton(name);
      }
      return this.instance
  }        
})();
// 获取对象1
const a = Singleton.getInstance('a');
// 获取对象2
const b = Singleton.getInstance('b');
// 进行比较
console.log(a === b);
也可以将上述的方法稍作修改,变成构造函数的形式,如下:
// 单例构造函数
function CreateSingleton (name) {
  this.name = name;
  this.getName();
};
// 获取实例的名字
CreateSingleton.prototype.getName = function() {
  console.log(this.name)
};
// 单例对象
const Singleton = (function(){
  var instance;
  return function (name) {
      if(!instance) {
          instance = new CreateSingleton(name);
      }
      return instance;
  }
})();
// 创建实例对象1
const a = new Singleton('a');
// 创建实例对象2
const b = new Singleton('b');
console.log(a===b); // true



三、使用场景


在前端中,很多情况都是用到单例模式,例如页面存在一个模态框的时候,只有用户点击的时候才会创建,而不是加载完成之后再创建弹窗和隐藏,并且保证弹窗全局只有一个


可以先创建一个通常的获取对象的方法,如下:

const getSingle = function( fn ){
let result;
return function(){
  return result || ( result = fn .apply(this, arguments ) );
}
};


创建弹窗的代码如下:


const createLoginLayer = function(){
var div = document.createElement( 'div' );
div.innerHTML = '我是浮窗';
div.style.display = 'none';
document.body.appendChild( div );
return div;
}; 
const createSingleLoginLayer = getSingle( createLoginLayer ); 
document.getElementById( 'loginBtn' ).onclick = function(){
var loginLayer = createSingleLoginLayer();
loginLayer.style.display = 'block';
};


上述这种实现称为惰性单例,意图解决需要时才创建类实例对象


并且Vuex、redux全局态管理库也应用单例模式的思想


现在很多第三方库都是单例模式,多次引用只会使用同一个对象,如jquery、lodash、moment...


⭐  写在最后


请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.


✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式


✅ 认为我部分代码过于老旧,可以提供新的API或最新语法


✅ 对于文章中部分内容不理解


✅ 解答我文章中一些疑问


✅ 认为某些交互,功能需要优化,发现BUG


✅ 想要添加新功能,对于整体的设计,外观有更好的建议


最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!

相关文章
|
7月前
|
设计模式 数据库连接 数据库
发挥设计模式单例模式的力量:从技术到社会的转变
发挥设计模式单例模式的力量:从技术到社会的转变
|
4月前
|
Java 开发者
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
44 7
|
3天前
|
敏捷开发 数据可视化 Java
低代码和无代码:简单概念之下的深刻内涵
从2020年到2024年,低代码和无代码开发平台凭借其独特优势,逐渐成为企业敏捷开发和快速响应市场变化的利器。本文深入探讨了这两种平台的概念、用户需求及开发内涵,揭示了它们在现代软件开发中的重要价值和应用场景,帮助读者更好地理解低代码和无代码平台的核心特点及其对企业数字化转型的推动作用。
|
3月前
|
开发者 UED
代码之外:软件开发者如何培养跨界思维
在技术飞速发展的今天,软件开发者面临的挑战已超越单纯编码技能。本文探讨了跨界思维的重要性及其对职业成功的推动作用。跨界思维能促进创新、提高适应性和增强沟通能力。通过学习新知识、参与多学科项目、建立多元化网络、培养创新思维及学习设计思维,开发者可全面提升自身能力。这不仅增强个人竞争力,还促进团队创新。
|
1月前
|
前端开发 JavaScript
前端界的革命:掌握这些新技术,让你的代码简洁到让人惊叹!
前端技术的快速发展带来了许多令人惊叹的新特性。ES6及其后续版本引入了箭头函数、模板字符串等简洁语法,极大减少了代码冗余。React通过虚拟DOM和组件化思想,提高了代码的可维护性和效率。Webpack等构建工具通过模块化和代码分割,优化了应用性能和加载速度。这些新技术正引领前端开发的革命,使代码更加简洁、高效、可维护。
26 2
|
2月前
|
开发工具 Android开发 数据安全/隐私保护
移动应用开发之旅:从理念到现实
【10月更文挑战第6天】在数字时代的浪潮中,移动应用已成为人们生活不可或缺的一部分。本文将带领读者深入了解移动应用的开发过程,包括设计理念、开发工具的选择、操作系统的对比,以及如何克服开发中的挑战。我们将通过具体案例,揭示一个成功移动应用背后的技术细节和创新思维。无论你是开发者还是对移动技术感兴趣的读者,这篇文章都将为你提供宝贵的见解和启发。
|
3月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
3月前
|
测试技术 Android开发 开发者
探索移动应用开发:从概念到市场的旅程
在数字时代,移动应用已成为我们日常生活的一部分。本文将带您穿越移动应用开发的迷宫,从最初的灵感火花到最终的产品发布,揭示背后的技术挑战与解决方案。我们将探讨如何克服这些障碍,确保应用不仅能够吸引用户,还能在市场上持续存在。通过实例和分析,本文旨在为开发者提供实用的指导和启示,帮助他们在竞争激烈的应用市场中脱颖而出。
36 0
|
4月前
|
UED 开发者
重塑网络世界!揭秘响应式网站的绝美设计与技术革新
【8月更文挑战第6天】在数字时代,响应式网站作为线上门户至关重要。它凭借自适应特性成为网页设计标配。通过媒体查询、流体网格及可伸缩图片等技术确保良好用户体验。美学不仅美化界面,更能提升体验、引导操作。设计师须理解品牌与用户需求,与开发者紧密协作,确保创意在各种设备上都能准确且美观地呈现,共同谱写技术与美学的协奏曲。
37 1
|
6月前
|
机器学习/深度学习 人工智能 算法
探索技术之美:从代码到创造
【6月更文挑战第11天】在数字时代的浪潮中,我们每个人都是既是观察者也是参与者。本文将带你穿梭于技术的迷宫,从一行行冰冷的代码到构建出令人振奋的创新,揭示那些隐藏在技术背后的艺术与哲理。我们将一起见证,如何通过技术的力量,将想象转化为现实,以及这一过程中蕴含的深刻感悟和无限可能。

相关实验场景

更多