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)最为熟悉和基础吧.当然,本文总结 ...
随机推荐
- 安卓笔记--Edittext禁止换行
直接在EditText的xml文件中通过配置android:singleLine="true"把虚拟键盘上的enter键禁止掉,不会显示 <edittext android: ...
- Win7笔记本电脑启用虚拟WIFI共享上网
今天看了一个帖子,win7系统通过笔记本的无线网卡,启用虚拟Wifi功能共享上网,自己尝试了一下,感觉很好用,至少没有无线路由的自己,手机可以上wifi了,更新软件玩微信等等,都方便多了,好了,废话不 ...
- 关于GPL329A添加摄像头驱动需要更改的配置脚本
我今天要添加一个ov2685的驱动进Digogo这部机子,当然要让它开机自动启动,就要想办法让它的.ko在启动文件系统的时候要自动被装载,这样上层打开摄像头才能加载摄像头驱动. 我找到源码工程对应添加 ...
- 智能合约最佳实践 之 Solidity 编码规范
每一门语言都有其相应的编码规范, Solidity 也一样, 下面官方推荐的规范及我的总结,供大家参考,希望可以帮助大家写出更好规范的智能合约. 命名规范 避免使用 小写的l,大写的I,大写的O 应该 ...
- java实习面试题(阿里一面)
1.抽象类和接口的不同点: 抽象类可以有构造函数,接口中不能有构造函数: 抽象类中可以有普通成员变量,但是接口中不能有普通成员变量: 抽象类中可以包含非抽象的普通方法,但是接口中必须是抽象方法:(jd ...
- reorder list(链表重新排序)
Given a singly linked list L: L0→L1→-→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→- You must do thi ...
- DDD中直接引用和ID关联的关系
聚合根到聚合根:通过ID关联: 聚合根到其内部的实体,直接引用: 聚合根到值对象,直接引用: 实体到聚合根: 通过ID关联 : 实体到其聚合的聚合根:1对1ID关联,1对多可直接引用 : 实体到其聚合 ...
- JAVA设计模式--学习总结(序)
设计模式(Design pattern)是一套被反复使用的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 常见的设计模式有23种.分为三大类:创建型模式, ...
- Oracle100w数据大表割接
[现网问题] 最近在给咪咕做视频后台管理,移动那边希望页面上,码流字段可以支持1位小数,如8.0.自己查看数据库,发现码流字段是Number整型,也就是要换类型,打算直接换成varchar2.因为自己 ...
- Golang中WaitGroup使用的一点坑
Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...