javascript设计模式 – 单例模式原理与应用实例分析

作者:李小强 时间:2024-04-29 14:09:29 

本文实例讲述了javascript设计模式 – 单例模式。分享给大家供大家参考,具体如下:

介绍:单例模式是结构最简单的设计模式。单例模式用于创建那些在软件系统中独一无二的对象,是一个简单但很实用的设计模式。

定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。

场景:日常编码中会有很多需要重用的场景,例如弹窗,键盘输入这类公共组件,我们往往希望它只创建一次,在第二次使用时重复使用之前创建好的实例。为了节约资源,提高性能,需要保证实例对象的唯一性,就可以采用单例模式实现。使用单例模式要注意:1.某个类只能有一个实例 2.它必须自行创建这个实例 3.它必须自行向整个系统提供这个实例

示例:

单利模式有两个分支,饿汉模式单例和懒汉模式单例。我们对比看下区别:


//懒汉模式单例demo
//懒汉模式:只有在我需要实例的时候才会第一次实例化,只有当我第一次调用getInstance时才会去执行init获取实例。
var Singleton = (function () {
 var instantiated;
 function init(){
   return {
     sayHello: function () {
       console.log('hello');
     }
   };
 }

return {
   getInstance: function () {
     if(!instantiated){
       instantiated = init();
     }
     return instantiated;
   }
 }
})();

//只能通过getInstance方法获取对象实例:
var instance = Singleton.getInstance();
var instance2 = Singleton.getInstance();
instance.sayHello(); //hello
instance2.sayHello(); //hello
console.log(instance === instance2); //true

//饿汉模式demo
//饿汉模式:在类初始化时就立刻执行getInstance进行赋值。
var Singleton = (function () {
 var instantiated = init();  //初始化时即对instantiated进行赋值
 function init(){
   return {
     sayHello: function () {
console.log('hello');
  }
};
 }

return {
getInstance: function () {
  return instantiated;
}
 }
})();

var instance = Singleton.getInstance();
var instance2 = Singleton.getInstance();
instance.sayHello(); //hello
instance2.sayHello(); //hello
console.log(instance === instance2); //true

以上demo思考一个问题,如果init函数是耗时操作,还能保证每个类只有一个实例吗?

在多线程的场景下,会出现init函数执行过程中再次触发getInstance。就会导致一个类存在多个实例。javascript会出现这样的问题吗?

两种单例模式对比下优缺点:饿汉模式在一开始就实例化,在资源合理利用方面落下风,懒汉模式在多线程情况下需要考虑同时初始化带来的影响。

单例模式总结:

优点:
* 严格控制实例的访问
* 节约系统性能,避免重复创建销毁对象,避免资源浪费

缺点:
* 单例模式的扩展必须修改类主体,这和我们前面介绍的开关原则冲突
* 单例模式职责过重,一定程度违背了单一职责原则,因为单例既提供了业务方法,也提供了创建对象的方法,有一定的功能耦合。

适用场景:
* 系统只需要一个实例对象
* 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。

希望本文所述对大家JavaScript程序设计有所帮助。

来源:104.116.116.112.58.47.47.119.119.119.46.105.115.106.115.46.99.110.47.63.112.61.57.52.50.

标签:javascript,设计模式,单例模式
0
投稿

猜你喜欢

  • Python Django中的STATIC_URL 设置和使用方式

    2021-08-07 13:39:06
  • 随机显示图片

    2009-07-26 10:13:00
  • ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数第1/2页

    2024-01-25 10:05:42
  • 用python实现k近邻算法的示例代码

    2022-08-28 16:08:58
  • Python正则表达式匹配和提取IP地址

    2023-04-01 07:25:21
  • Python异常对代码运行性能的影响实例解析

    2023-10-18 23:35:39
  • 使用python的pandas库读取csv文件保存至mysql数据库

    2024-01-22 00:26:19
  • Flask 入门系列 Cookie与session的介绍

    2022-06-21 00:45:44
  • MySQL数据库导入导出数据之报错解答实例讲解

    2024-01-24 14:56:49
  • 如何利用python进行时间序列分析

    2022-01-21 13:56:38
  • Python实现简单的可逆加密程序实例

    2022-12-18 10:39:56
  • pandas DataFrame 行列索引及值的获取的方法

    2022-03-24 06:14:11
  • python机器学习Sklearn实战adaboost算法示例详解

    2023-08-15 06:35:59
  • plt.figure()参数使用详解及运行演示

    2021-11-01 04:52:19
  • python pandas中DataFrame类型数据操作函数的方法

    2022-10-22 09:33:12
  • Perl操作系统环境变量的脚本代码

    2022-12-27 12:17:22
  • smarty模板引擎从配置文件中获取数据的方法

    2024-05-13 09:23:02
  • pytorch常用数据类型所占字节数对照表一览

    2021-07-25 15:26:29
  • MySQL 4.0 升级到mysql 5.0的方法

    2024-01-18 10:07:12
  • Python pygorithm模块用法示例【常见算法测试】

    2023-05-19 00:23:59
  • asp之家 网络编程 m.aspxhome.com