JavaScript设计模式之单例模式详解


Posted in Javascript onJune 09, 2017

最近项目不太忙,难得有时间看看书,平时挺喜欢js这门语言。也看过很多高级教程,觉得自己还是比较热衷于js的设计模式。这一次重温一下《JavaScript设计模式与开发实践》,开篇为单例模式。

/**
 * pre 单例模式
 * 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点
 * 应用:单例模式是一种常用的模式,有一些对象我们往往只需要一个,
 * 比如线程池、全局缓存、浏览器中的 window 对象等。
 */
//--------------singleton-01-------------
/*写法1*/
var Singleton = function(name){
 this.name = name;
 this.instance = null;
};

Singleton.prototype.getName = function(){
 alert(this.name);
};

Singleton.getInstance = function(){
 if(!this.instance){
  this.instance = new Singleton(name);
 }
 return this.instance;
};

var a = Singleton.getInstance("amy");
var b = Singleton.getInstance("ben");
alert(a === b);

// ------------singleton-02----------------
/*写法2*/
var Singleton = function(name){
 this.name = name;
}
Singleton.prototype.getName = function(){
 return this.name;
}

Singleton.getInstance = (function(){
 var instance = null;
 return function(name){
  if(!instance){
   instance = new Singleton(name);
  }
  return instance;
 }
})();

var a = Singleton.getInstance("amy");
var b = Singleton.getInstance("ben");
alert(a === b);

// ------------singleton03-----------
/*写法3*/
var Singleton = (function(){
 var instance;
 return function(name){
  if(instance){
   return instance;
  }
  this.name = name;
  instance = this;
 }
})();
var a = new Singleton("amy");
var b = new Singleton("ben");
alert(a === b);

//---------------- 示例 ---------------
var getSingleton = function(fn) {
 var result;
 return function() {
  if(!result) {
   result = fn.apply(this, arguments);
  }
  return result;
 }
};

var getSingletonVip = (function() {
 var instance;
 return function(fn) {
  return instance || (instance = fn.apply(this, arguments));
 }
})();

var createLoginUser = function() {
 var div = document.createElement("div");
 div.innerHTML = '这是登录框';
 document.body.appendChild(div);
 return div;
};

var createInfoGrid = function() {
 var div = document.createElement("div");
 div.innerHTML = '这是列表信息框';
 document.body.appendChild(div);
 return div;
};
//--执行singleton1 
var createUserDiv = getSingleton(createLoginUser);
createUserDiv();
createUserDiv();

//--执行singleton2
getSingletonVip(createLoginUser);
getSingletonVip(createLoginUser);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript实现禁止后退的方法
Dec 27 Javascript
ExtJS4中使用mixins实现多继承示例
Dec 03 Javascript
轻松掌握JavaScript中介者模式
Aug 26 Javascript
js 获取本地文件及目录的方法(推荐)
Nov 10 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
Mar 04 Javascript
vue分类筛选filter方法简单实例
Mar 30 Javascript
vue源码入口文件分析(推荐)
Jan 30 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
May 27 Javascript
vue监听input标签的value值方法
Aug 27 Javascript
在Angular中使用JWT认证方法示例
Sep 10 Javascript
对VUE中的对象添加属性
Sep 18 Javascript
微信小程序激励式视频广告组件使用详解
Dec 06 Javascript
Bootstrap Table使用整理(四)之工具栏
Jun 09 #Javascript
JavaScript设计模式之策略模式详解
Jun 09 #Javascript
Bootstrap Table使用整理(三)
Jun 09 #Javascript
Bootstrap Table使用整理(二)
Jun 09 #Javascript
Bootstrap Table使用整理(一)
Jun 09 #Javascript
Bootstrap Table使用整理(五)之分页组合查询
Jun 09 #Javascript
JS实现简易的图片拖拽排序实例代码
Jun 09 #Javascript
You might like
php 删除记录实现代码
2009/03/12 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
PHP 远程关机实现代码
2009/11/10 PHP
php设计模式 State (状态模式)
2011/06/26 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
JS 文件大小判断的实现代码
2010/04/07 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
详解js中==与===的区别
2017/01/08 Javascript
详解Vue 开发模式下跨域问题
2017/06/06 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
ES6之模版字符串的具体使用
2018/05/17 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
python中import学习备忘笔记
2017/01/24 Python
python 函数传参之传值还是传引用的分析
2017/09/07 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
Python格式化输出%s和%d
2018/05/07 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
python带参数打包exe及调用方式
2019/12/21 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
瑜伽国际:Yoga International
2018/04/18 全球购物
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
技校学生个人职业生涯规划范文
2014/03/03 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
nginx.conf配置文件结构小结
2022/04/08 Servers