JavaScript 设计模式之----单体(单例)模式
设计模式之—-单体(单例)模式
1、介绍
从本章开始,我们会逐步介绍在JavaScript里使用的各种设计模式实现,在这里我不会过多地介绍模式本身的理论,而只会关注实现。OK,正式开始。
在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。
2、 简单单体与闭包单体
在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的方法,其字面量里可以包含大量的属性和方法:
<!DOCTYPE html>
<html>
<head>
<meta name="name" content="content" charset="utf-8">
<title>javascript单体模式</title>
</head>
<body>
<script>
//单体模式(sigleton)--无法new();因为他已经真是存在了
/*1、简单单体--对象自变量的模式*/
/* var Sigleton ={
attr1 : true,
attr2 : 10,
method1: function(){
alert("我是方法1");
},
method2 : function(){
alert("我是方法2");
}
};
alert(Sigleton.attr1);
//单体模式主要是划分命名空间,区分不同人之间的代码
var BHX =BHX || {};
BHX.Sigleton ={
attr1 : true,
attr2 : 10,
method1: function(){
alert("我是方法1");
},
method2 : function(){
alert("我是方法2");
}
};
BHX.Sigleton.method1();*/
/*2、闭包单体---借用闭包穿简单体(闭包的主要目的:保护数据)*/
//命名空间--块级作用域的实现
/* (function test(){
alert(11);
})()*/
var BHX = BHX || {};
BHX.Sigleton2=(function(){
//用闭包的作用就是把自己的私有属性给封装起来,不让外界访问。只有return暴露出来才能访问。
var a1 = true;
var a2 = 10;
var f1 = function(){
alert("function f1");
};
var f2 = function(){
alert("function f2");
};
//要把块级作用域的东西赋值给Sigleton2,要有return语句。
return{
attr1 : true,
attr2 : 10,
method1: function(){
return f1();
},
method2 : function(){
return f2;
}
};
})();
alert(BHX.Sigleton2.attr1);
BHX.Sigleton2.method1();
</script>
</body>
</html>
上面的代码很不错了,但如果我们想做到只有在使用的时候才初始化,那该如何做呢?为了节约资源的目的,我们可以另外一个构造函数里来初始化这些代码,如下:
3、 惰性单体和分支单体
<!DOCTYPE html>
<html>
<head>
<title>javascript 单体模式2</title>
</head>
<body>
<script>
/*3、惰性单体---(和闭包单体有一些相似的地方)但是可以用变量来控制要返回那些内容,而不是所有的都返回,这样在大项目中很有好处*/
//命名空间
var BHX = BHX || {};
BHX.Base =(function(){
//利用私有变量控制 返回的单体对象
var uniqueInstance; //undefined
//需要一个构造器init 初试化对象的方法
function init(){
var a1 = true;
var a2 = 10;
var f1 = function(){
alert("function f1");
};
var f2 = function(){
alert("function f2");
};
return{
attr1 : true,
attr2 : 10,
method1: function(){
return f1();
},
method2 : function(){
return f2;
}
};
};
return {
getInstance:function(){
if (!uniqueInstance) { //如果不存在,则创建单体实例
uniqueInstance =init();
};
return uniqueInstance;
}
};
})();
//BHX.Base.getInstance().method1();
/*4、分支单体--和swich if else类似,可以用于底层框架浏览器的差异性检测*/
var Ext =Ext ||{};
var diff = true;
Ext.More =(function(){
var ObjA={ //火狐浏览器
//属性1
attr1:"火狐属性1"
//属性2
//方法1
//方法2
};
var ObjB={
//属性1
attr1:"IE属性1"
//属性2
//方法1
//方法2
};
return (diff)? ObjA : ObjB;
})();
alert(Ext.More.attr1);
</script>
</body>
</html>
知道了单例如何实现了,但单例用在什么样的场景比较好呢?其实单例一般是用在系统间各种模式的通信协调上,下面的代码是一个单例的最佳实践:
4、 最佳实践
var SingletonTester = (function () {
//参数:传递给单例的一个参数集合
function Singleton(args) {
//设置args变量为接收的参数或者为空(如果没有提供的话)
var args = args || {};
//设置name参数
this.name = 'SingletonTester';
//设置pointX的值
this.pointX = args.pointX || 6; //从接收的参数里获取,或者设置为默认值
//设置pointY的值
this.pointY = args.pointY || 10;
}
//实例容器
var instance;
var _static = {
name: 'SingletonTester',
//获取实例的方法
//返回Singleton的实例
getInstance: function (args) {
if (instance === undefined) {
instance = new Singleton(args);
}
return instance;
}
};
return _static;
})();
var singletonTest = SingletonTester.getInstance({ pointX: 5 });
console.log(singletonTest.pointX); // 输出 5
5、其他实现方式
参考可见博客:(http://www.cnblogs.com/TomXu/archive/2012/02/20/2352817.html)
版权声明:本文为小平果原创文章,转载请注明:http://blog.csdn.net/i10630226
JavaScript 设计模式之----单体(单例)模式的更多相关文章
- Java设计模式:Singleton(单例)模式
概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...
- javascript --- 设计模式之单体模式(二)
在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的方法,其字面量里可以包含大量的属性和方法: var her = { property1: 'someing', ...
- javascript设计模式详解之策略模式
接上篇命令模式来继续看下js设计模式中另一种常用的模式,策略模式.策略模式也是js开发中常用的一种实例,不要被这么略显深邃的名字给迷惑了.接下来我们慢慢看一下. 一.基本概念与使用场景: 基本概念:定 ...
- javascript设计模式详解之命令模式
每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某 ...
- Singleton(单例)模式
Singleton(单例)模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. public class Singleton { private static Singleton ourIns ...
- java23种设计模式之二: 单例设计模式(6种写法)
目的:在某些业务场景中,我们需要某个类的实例对象的只能有一个,因此我们需要创建一些单例对象. 本文共有6种写法,仅供参考 1.饿汉式 优点: 在多线程情况下,该方法创建的单例是线程安全的(立即加载) ...
- 【java设计模式】之 单例(Singleton)模式
1. 单例模式的定义 单例模式(Singleton Pattern)是一个比較简单的模式.其原始定义例如以下:Ensure a class has only one instance, and pro ...
- iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)
关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...
- 从别人写的 Object-C 中 Singleton (单例) 模式 中的一些理解--备
关于 面向对象的设计模式 对于面向对象的设计模式,想必大家并不陌生吧. 纵观23种设计模式中,数单例模式(Singleton)和工厂模式(Factory Method)最为熟悉和基础吧.当然,本文总结 ...
随机推荐
- Leetcode_263_Ugly Number
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/49431329 Write a program to che ...
- C#实现MD5算法
using UnityEngine; using System.Collections; using System.Security.Cryptography; public class GetMD5 ...
- unix命令自我总结
三种参数类型 1⃣时间日期: cal times time 2⃣文字处理: ctl+v 输入控制字符 ${#str} str字符串长度 expr length $abc 同上 typeset -i x ...
- LeetCode之旅(19)-Power of Two
题目 Given an integer, write a function to determine if it is a power of two. Credits: Special thanks ...
- 面试心得随谈&线程并发的总结
---恢复内容开始--- 线程同步有两种实现方式: 基于用户模式实现和用内核对象实现.前者偏于轻量级,性能也更好,但是只能用于同一进程间的线程同步,后者重量级,性能消耗更大,跨进程. 研读了一下win ...
- html5中新增的属性和删除的属性
一.表单新增的属性 1.对input(type="text").select.textarea与button元素指定autofocus属性,它以指定属性的方式让元素在画面打开时自动 ...
- 记一次erlang语言bug导致rabbitmq的队列没有消费者的问题
公司开发和测试环境采用的erlang版本是19.0.3,rabbitmq版本为3.6.10.集群条件下稳定使用了近一年时间,没什么问题. 为了保持和线下一致,线上生产环境采用了相同的版本,运行几个月后 ...
- jquery性能优化的38个建议
一.注意定义jQuery变量的时候添加var关键字 这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下: $loading = $('#loading'); ...
- Java——面向对象 this关键字
this,当成员变量和局部变量名字重名时,可以用关键字来区分. this 代表当前对象,就是所在函数所属的对象的引用. 即哪个调用了this所在的函数,this就代表哪个函数. 应用:1,构造方法间的 ...
- ecshop 修改记录20150710
ecshop 修改记录20150710 1:去掉头部TITLE部分的ECSHOP演示站 Powered by ecshop 前台部分:在后台商店设置 - 商店标题修改 后者打开includes/lib ...