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


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. 安卓TV开发(九) Android模拟事件 遥控器变身成鼠标来操作TV

    本文出处:http://blog.csdn.net/sk719887916/article/details/40348853,作者:skay      阅读此文建议先阅读 安卓Tv开发(二)移动智能电 ...

  2. 【编程练习】kmp算法代码

    代码来自: http://blog.csdn.net/v_JULY_v #include "StdAfx.h" #include <iostream> using na ...

  3. 通过jQuery源码学习javascript(三)

    承接上两篇继续写下去.我尽量把我明白的地方给大家说清楚.有些大家的提问我也有点搞不明白,如果有人能解答,再好不过了 疑问  第一篇中有位博友提出了以下的问题,我也不太明白,如果有明白的,能否告知一.二 ...

  4. struts 开发流程

  5. datetimepicker日期框选择后,无法触发bootstrapValidator

    如上图所示,当选择日期后下面的"栏位不能为空"提示并不能及时的消失,同时点击提交按钮也没有用. 解决如下: 在birthday的校验规则里面添加trigger:'change',就 ...

  6. java -- 对Map按键排序、按值排序

                             java  -- 对Map按键.按值排序 1.按键排序(sort by key) 直接上代码  ↓ public Map<String, Str ...

  7. rsync的详细配置

    服务器配置: yum install rsync   安装rsync vi /etc/rsyncd.conf   创建主配置文件 pid file = /var/run/rsyncd.pid port ...

  8. POP3和imap

    POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110).本协议主要用于支持使用客户端远程管理在服务器上的电子邮 ...

  9. 免费私有gitLab服务推荐

    阿里云code :https://code.aliyun.com/,可以免费开50个私有项目. 配套的持续交付:https://crp.aliyun.com

  10. neo4j-rest-client使用摘要

    1.使用它的原因,与django搭配的最好的neomodel目前只支持到v2.2,我已给官方发了issue,官方也回复了,马上修改并发布(老外对开源项目的负责态度让人感动) 2.这个库的文档中大概描述 ...