js设计模式学习 --- 单例模式1

什么单例模式


定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问。

单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池、全局缓存、浏览器中的window 对象等。在JavaScript 开发中,单例模式的用途同样非常广泛。试想一下,当我们单击登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用单例模式来创建。

实现单例模式

  1. <script type="text/javascript">
  2. var CreateDiv = function(html){
  3. this.html = html;
  4. this.init();
  5. };
  6. CreateDiv.prototype.init = function(){
  7. var div = document.createElement(‘div‘);
  8. div.innerHTML = this.html;
  9. document.body.appendChild(div);
  10. };
  11. /*为了满足单一职责,这里引入代理*/
  12. var ProxySingletonCreateDiv = (function(){
  13. var instance;
  14. return function(html){
  15. if(!instance){
  16. instance = new CreateDiv(html);
  17. }
  18. return instance;
  19. }
  20. })();
  21. var a = new ProxySingletonCreateDiv(‘11‘);
  22. var b = new ProxySingletonCreateDiv(‘22‘);
  23. alert(a===b);
  24. </script>

为了实现单一职责,引入代理实现了单例,CreateDiv作为一个普通的类,ProxySingletonCreateDiv负责完成单例

JavaScript中的单例模式


在java中,想要实现单例模式,需要先定义一个类,然后创建实例, 在以类为中心的语言中,这是很自然的做法,然而,JavaScript中并无类的概念,生搬硬套并无意义。单例模式的核心是确保只有一个实例,并提供全局访问,既然是要创建一个唯一的对象,为什么一定要创建一个“类”呢?

在js中创建唯一的对象很简单

  1. var obj = {};

如果这句话放在全局作用域下,就满足了单例模式的两个条件。全局变量不是单例模式,但在开发中,我们经常会把全局变量当成单例使用。

但是全局变量很容易造成命名空间污染,在大型项目中,自己创建的对象很容被别人覆盖掉,所以开发中尽量少用全局变量,或者使用命名空间、闭包降低污染。

1.命名空间

  1. <script type="text/javascript">
  2. /*采用字面量创建*/
  3. var std = {
  4. foo: function(){
  5. alert (1);
  6. },
  7. bar:{
  8. str:‘hello world‘,
  9. say:function(){
  10. alert(this.str);
  11. }
  12. }
  13. };
  14. /*动态创建*/
  15. var com = {};
  16. com.namespace = function(name){
  17. var current = com,
  18. parts = name.split(‘.‘);
  19. for(var i in parts){
  20. if(!current[parts[i]]){
  21. current[parts[i]] = {};
  22. }
  23. current = current[parts[i]];
  24. }
  25. };
  26. com.namespace(‘demo‘);
  27. com.namespace(‘dom.style.display‘);
  28. console.log(com);
  29. /*相当于*/
  30. var com = {
  31. demo: {},
  32. dom: {
  33. style: {
  34. display:{}
  35. }
  36. }
  37. };
  38. </script>

2.采用闭包封装私有变量

  1. <script type="text/javascript">
  2. var user = (function(){
  3. var __name = ‘sven‘,
  4. __age = 29;
  5. return {
  6. getUserInfo: function(){
  7. return __name + ‘-‘ + __age;
  8. }
  9. }
  10. })();
  11. </script>

我们用下划线约定私有变量,他们被封装在闭包作用于中,外部无法访问,从而避免了全局命名空间污染

惰性单例










来自为知笔记(Wiz)

时间: 2024-11-03 22:10:40

js设计模式学习 --- 单例模式1的相关文章

js 设计模式学习(1)

最近一个人外出旅行 顺便在那座城市买了一本关于JS设计模式的书 供无聊的时候阅读 却发现小有收获 旅游回来以后立马写下心得 做了一个地图 并以此总结此次旅行的经过的地方 尝试1: 尝试写JS类 1 var TianDiTu = function (lat, lng, zoom) { 2 if (this instanceof TianDiTu) { 3 var zoomSize = { maxZoom: 18, minZoom: 5 }, 4 normalm = L.tileLayer.chin

js设计模式学习一(单例模式)

写在最前 为什么会有设计模式这样的东西存在,那是因为程序设计的不完美,需要用设计模式来弥补设计上的缺陷,那立马估计会有童鞋问,既然设计的不完美,那就换个完美点的语言,首先,没有绝对完美的语言存在,其次,借鉴下前辈说的话,灵活而简单的语言更能激发人们的创造力,所以生命力旺盛,这也能够解释,近些年来前端发展的如此迅速的原因吧. ps一段,自从开始正儿八经深入学习前端已经有一年多左右了,当时定的一个看书目标就是最初的是dom入门,之后是高三书和犀牛书,截止到现在这三本基本都算看完了,犀牛书后续的一些章

java设计模式学习 ----- 单例模式(Singleton)

单例模式(Singleton) 单例对象(Singleton)是一种经常使用的设计模式. 在Java应用中,单例对象能保证在一个JVM中,该对象仅仅有一个实例存在.单例模式也分三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有几个长处: 1.某些类创建比較频繁,对于一些大型的对象,这是一笔非常大的系统开销. 2.省去了new操作符,减少了系统内存的使用频率,减轻GC压力. 3.有些类如交易所的核心交易引擎.控制着交易流程,假设该类能够创建多个的话,系统全然乱了.(比方一个军队出现了多个司令员

js设计模式之单例模式

关于设计模式,我的理解是它是业务代码的提前解决方案.意思就是说在没有真正的业务之前,设计模式就存在了,这个是显然的.设计模式是人长期从事业务总结的具有普通适用性的解决方案. 就个人来讲,写了太多的命令式编程代码,所谓命令式代码就是业务需要怎样就写怎么样的功能,比如添加一个点击事件,比如进行一个验证等扥.写就写了很少站在设计模式的角度或者前人的角度去改善代码. 不给自己找客观原因,最近开始关注设计模式,尝试从设计模式的角度改善开发. 在开始单例设计模式之前首先要搞清楚js之中的apply和call

(@WhiteTaken)设计模式学习——单例模式

单例模式,个人理解就是,使用了这个模式,可以保证一个类只生成唯一的实例对象.就是在整个程序中,这个类只存在一个实例对象. GoF对单例模式的定义:保证一个类,只有一个实例存在,同时提供能对该实例加以访问的全局访问方法. 客户端的代码用来测试,获取到的实例只有一个.直接上代码. 1 public class MainClass { 2 public static void main(String[] args) { 3 Person person1=Person.getPerson();//获取P

理解js设计模式之单例模式

单例模式的定义:只提供唯一的一个实例来让你访问 js中单例是天然存在的: var a1={ hello:'js' } var a2={ hello:'js' } console.log(a1===a2) //false 任意生成的一个对象字面量其实就是一个对象而且他也是唯一的,对象字面量声明对象的方式,每次都会在对内存中创建一个新的空间,所以不管你对象里面的东西一不一样,他们就是不一样的(本质是地址不一样) 但是这样的单例是不可靠的,很容易被覆盖...你将a1,a2赋一个新的值,之前的单例对象就

javascript设计模式学习——单例模式

单例模式:又被称为单体模式,是只允许实例化一次的对象类. 运用: 1.用一个对象来规划一个命名空间(如:JQuery库,单例模式就为它提供了一个命名空间),井井有条地管理对象上的属性与方法. 2.通过单例模式来管理代码库的各个模块 模块化的概念由来已久,并且在JS中也有很长久的使用历史.通常我们在编写代码时,会将复杂的问题根据实际情况进行合理的拆分,让代码更具备可读性与可维护性.因此一个模块可以理解为整体的一部分.而且随着JS应用复杂度的提高,模块化的应用也变成了必须. 在之前的JS中,没有专门

JS 设计模式之单例模式

?一.概念: 一个类 仅有一个实例 提供一个访问它的全局访问点 ?二.实现: class SimpleOne { constructor (name) { this.name = name; } getName (propsName) { this.name = propsName; return typeof this.name; } } const a = new SimpleOne('a').getName(); const b = new SimpleOne('b').getName()

设计模式学习-单例模式

定义:确保某一个类只有一个实例,而且自行实例化向整个系统提供整个实例 使用场景: 要求生产唯一序号的环境 在整个项目中需要一个共享访问点或共享数据,例如程序计数器 创建一个对象需要消耗的资源过多 需要定义大量的静态常量或静态方法的环境 实例: package cn.lonecloud.singleton; /** * @author lonecloud * @version v1.0 * @date 下午3:44 2018/3/16 */ public class DemoSingleton {