设计模式之—-单体(单例)模式


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 设计模式之----单体(单例)模式的更多相关文章

  1. Java设计模式:Singleton(单例)模式

    概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...

  2. javascript --- 设计模式之单体模式(二)

    在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的方法,其字面量里可以包含大量的属性和方法: var her = { property1: 'someing', ...

  3. javascript设计模式详解之策略模式

    接上篇命令模式来继续看下js设计模式中另一种常用的模式,策略模式.策略模式也是js开发中常用的一种实例,不要被这么略显深邃的名字给迷惑了.接下来我们慢慢看一下. 一.基本概念与使用场景: 基本概念:定 ...

  4. javascript设计模式详解之命令模式

    每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某 ...

  5. Singleton(单例)模式

    Singleton(单例)模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. public class Singleton { private static Singleton ourIns ...

  6. java23种设计模式之二: 单例设计模式(6种写法)

    目的:在某些业务场景中,我们需要某个类的实例对象的只能有一个,因此我们需要创建一些单例对象. 本文共有6种写法,仅供参考 1.饿汉式 优点: 在多线程情况下,该方法创建的单例是线程安全的(立即加载) ...

  7. 【java设计模式】之 单例(Singleton)模式

    1. 单例模式的定义 单例模式(Singleton Pattern)是一个比較简单的模式.其原始定义例如以下:Ensure a class has only one instance, and pro ...

  8. iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)

    关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...

  9. 从别人写的 Object-C 中 Singleton (单例) 模式 中的一些理解--备

    关于 面向对象的设计模式 对于面向对象的设计模式,想必大家并不陌生吧. 纵观23种设计模式中,数单例模式(Singleton)和工厂模式(Factory Method)最为熟悉和基础吧.当然,本文总结 ...

随机推荐

  1. Aandroid 图片加载库Glide 实战(一),初始,加载进阶到实践

    原文: http://blog.csdn.net/sk719887916/article/details/39989293 skay 初识Glide 为何使用 Glide? 有经验的 Android ...

  2. mahout系列----minhash聚类

    Map: Vector featureVector = features.get(); if (featureVector.size() < minVectorSize) {       ret ...

  3. Sencha touch 2 入门 -------- DataView 显示服务器端JSON文件数据

    今天学习了下DataView如何显示JSON文件数据,废话不多说,直接贴代码: 首先看下文件目录: 然后看下我们要处理的JSON文件,bookInfo.json. { "success&qu ...

  4. nasm预处理器(3)

    nasm提供一个限定符.nolist,可以包含它到一个宏定义中,这样该宏就不会在列表文件中被展开:限定符 .nolist直接放到参数后面: %macro foo 1.nolist 条件汇编 和C预处理 ...

  5. 前端iFrame跨域问题

    一.父域访问子域的元素 项目需求: iFrame是个聊天窗口,要求聊天窗口中点击图片图标,在父域将内容展示出来. 解决方法:(jQuery) 首先/要等iFrame加载完再执行函数!(代码如下) va ...

  6. 简单poi创建execl

    Workbook workbook = new HSSFWorkbook();// 创建一个Excel文件 Workbook workbook = new XSSFWorkbook();// 创建一个 ...

  7. Jsp 连接 mySQL、Oracle 数据库备忘(Windows平台)

    Jsp 环境目前最流行的是 Tomcat5.0.Tomcat5.0 自己包含一个 Web 服务器,如果是测试,就没必要把 Tomcat 与 IIS 或 Apache 集成起来.在 Tomcat 自带的 ...

  8. Oracle面试过程中常见的二十个问题

    1.冷备份和热备份的不同点以及各自的优点  解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份.而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库.热备份的优点在于当备份时, ...

  9. Partitions - Partition Storage Modes and Processing-MOLAP、ROLAP、HOLAP

    https://docs.microsoft.com/en-us/sql/analysis-services/multidimensional-models-olap-logical-cube-obj ...

  10. java-随机生成用户名(中文版及英文版)

    开发中遇到用户名随机生成的问题,总结了两个(中文版和英文版),相关方法在此,方便直接调用. 如下: //自动生成名字(中文) public static String getRandomJianHan ...