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


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. Linux磁盘 - fdisk,partprobe, mkfs, mke2fs, fsck, badblocks, mount, mknod

    磁盘分区: fdisk [root@www ~]# fdisk [-l] 装置名称 选项与参数: -l :输出后面接的装置所有的 partition 内容.若仅有 fdisk -l 时, 则系统将会把 ...

  2. mybatis源码之SimpleStatementHandler

    /** * @author Clinton Begin */ public class SimpleStatementHandler extends BaseStatementHandler { pu ...

  3. Github搜索技巧-如何使用github找到自己感兴趣的项目

    Github现在不仅仅作为一个版本控制工具,更是一个开源的仓库,里面不但有优秀的开源代码,电子书,还有一些五花八门的项目,有些国家的法律也放在上面,作为程序员如何找到自己感兴趣的项目就非常重要了! 欢 ...

  4. LeetCode(28)-Remove Duplicates from Sorted Array

    题目: Given a sorted array, remove the duplicates in place such that each element appear only once and ...

  5. LeetCode(34)-Palindrome Number

    题目: Determine whether an integer is a palindrome. Do this without extra space. 思路: 求一个整数是不是回文树.负数不是, ...

  6. LeetCode(33)-Pascal's Triangle II

    题目: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return ...

  7. 线程ava.lang.OutOfMemoryError: unable to create new native thread

    近日开发遇到多线程的问题: java.lang.OutOfMemoryError: unable to create new native thread Exception in thread &qu ...

  8. OVS+DPDK Datapath 包分类技术

    本文主体内容译于[DPDK社区文档],但并没有逐字翻译,在原文的基础上进行了一些调整,增加了对TSS分类器的详细阐述. 1. 概览 本文描述了OVS+DPDK中的包分类器(datapath class ...

  9. python字符串27种常见的方法

    如有字符串 mystr = 'hello world itcast and itcastcpp' ,以下是常见的操作: <1>find 检测 str 是否包含在 mystr中,如果是返回开 ...

  10. 关于windows修改远程登录端口的问题

    windows远程桌面默认使用的是3389,为了避免被别用用心的扫描从而暴力破解远程服务器或者vps的账户信息.可以修改默认端口3389到其它端口,如8000,10000等.最好修改为10000以后的 ...