单例模式的三个特点:
  1,该类只有一个实例
  2,该类自行创建该实例(在该类内部创建自身的实例对象)
  3,向整个系统公开这个实例接口

模式1:

class Singleton {
//私有,静态的类自身实例
private static Singleton instance = new Singleton(); //私有的构造子(构造器,构造函数,构造方法)
private Singleton(){} //公开,静态的工厂方法
public static Singleton getInstance() {
return instance;
}
}
Singleton obj = Singleton.getInstance();

  这个单例类在自身被加载时instance会被实例化,即便加载器是静态的。因此,对于资源密集配置开销较大的单体更合理的做法是

将实例化(new)推迟到使用它的时候。即惰性加载(Lazy loading),它常用于那些必须加载大量数据的单体。修改下

模式2:

class LazySingleton {
//初始为null,暂不实例化
private static LazySingleton instance = null; //私有的构造子(构造器,构造函数,构造方法)
private LazySingleton(){}
   private static object lockObj = new object(); //公开,静态的工厂方法,需要使用时才去创建该单体  
public static LazySingleton getInstance() {
if( instance == null ) {
lock(lockObj){
         instance = new LazySingleton();
       }
}
return instance;
}
}

模式3:

public class SingletonProvider<T> where T : new()
{
SingletonProvider() { } public static T Instance
{
get { return SingletonCreator.instance; }
} class SingletonCreator
{
static SingletonCreator() { }
internal static readonly T instance = new T();
}
}

Javascript 单例:

单例模式是Javascript最基本,最有用的模式之一。它提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码通过单一的变量进行访问。
单体在Javascipt中有许多用处,可以用来划分命名空间,以减少全局变量的泛滥。还可以用在分支技术中用来处理各浏览器的差异。
Javascript中单例模式的实现方式有多种,每一种都有自身的优点或缺点。 ,对象直接量实现最基本,最简单的单体 var Singleton = {
attr1 : ,
attr2 : 'hello',
method1 : function(){alert(this.attr2);},
method2 : function(arg){}
}
这种方式中,对象所有成员都通过Singleton加点号访问。所有成员是公开的,没有私有的。在执行到变量Singleton时,会加载(实例化)自身,即非惰性加载。
此外method1用this访问单体的其它成员会存在一些风险,因为method1的上下文不是总是指向Singleton对象。
比如当把method1作为事件监听器时,this可能指向的是dom元素,这时可能会提示undefined。

2,闭包实现私有成员的单体

var Singleton = function(){

    var attr = , fn = function(){};
return {
method : function(){ fn(); },
getAttr : function(){ return attr; }
};
}();

  这种方式中var定义私有的成员属性attr,方法fn,然后返回一个公开的接口method和getAttr。今后修改实现时,接口方法method和getAttr不变,

只需修改私有的attr和fn的具体实现。使用如下

Singleton.method();
Singleton.getAttr();

注:

var Singleton = function(){               var Singleton = function(){
}(); =====> };
Singleton.method(); var single = new Singleton(); single.method();

3,闭包实现私有成员的惰性实例化单体

var LazySingleton = function(){
var attr = , fn = function(){ alert('fn called'); };
var _instance;
var init = function(){
alert('Lazy构造函数应该只执行一次');
_instance = {
method : function(){ fn(); },
getAttr : function(){ return attr; }
};
init = function(){ return _instance; };
return _instance;
};
var ret = function(){ return init(); };
return { getInstance : ret };
}();
alert('Lazy构造函数还没被执行');
LazySingleton.getInstance().method();
alert(LazySingleton.getInstance().getAttr());

  适用场合上面已经提到:对于那些必须加载大量数据的单体直到需要使用它的时候才实例化。使用方式是这样的

LazySingleton.getInstance().method();
LazySingleton.getInstance().getAttr();

C# JS 单例的更多相关文章

  1. Highcharts error #16: www.highcharts.com/errors/16 js 单例

    一.问题项目某一个页面用的highcharts用来显示一张图表,第一次刷新正常,第二次就出来这个错.1二.解决问题过程在网上找了很多同样是这个错误的解决方案. 第一:加载了highstock.js然后 ...

  2. JS单例设计模式

     单例,指的是只有一个实例的对象.    在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为.比如在整个系统的配置文件中,配置 ...

  3. JS单例对象与构造函数对象的区别

    JavaScript对象有几种: 内置对象如Global,Math对象等等. 本地对象如Object.Function.Array.String.Boolean.Number.Date.RegExp. ...

  4. JS单例

    s = (function S(){ var bean; function get(){ if(bean){ return bean }else{ bean = T(); return bean; } ...

  5. js之单例

    所谓单例,指的是只有一个实例的对象. js通过对象字面量的方式来创建单例对象. var sig = { name:value, method:function(){ } }

  6. js的单例

     对于 JS 来说,巨大的灵活性使得其可以有多种方式实现单例模式,使用闭包方式来模拟私有数据,按照其思路可得: var single = (function(){ var unique; functi ...

  7. js实现单例

    单例无外乎每次调用返回的都是同一个对象,可以利用闭包实现 function Singleton(){ this.data = "singleton"; } Singleton.ge ...

  8. SpringMvc 单例

    struts2的controller是多例,是因为其中有modeldriven将比如user 或者其他属性暴露出来,接受属性,特别是继承了actionsupport之后,fielderror的属性也会 ...

  9. javascript学习(9)——[设计模式]单例

    单例模式,相信大家对此都不陌生,我们主要讲下javascript中几个比较常见的设计模式: (1).普通的单体 (2).具有局部变量的强大单体 (3).惰性单体 (4).分支单体 下面我们就一一进行介 ...

随机推荐

  1. 设置centos7语言显示环境

    1.查看可选语言显示包 locale -a ............(省略好多) zh_CNzh_CN.gb18030zh_CN.gb2312zh_CN.gbkzh_CN.utf8zh_HKzh_HK ...

  2. angularjs(二)模板终常用的指令的使用方法

    通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的.ng的模板真是让我爱不释手.学习ng道路还很漫长,从模板 ...

  3. spring 的aop proxy 代理

    前些日子一朋友在需要在目标对象中进行自我调用,且需要实施相应的事务定义,且网上的一种通过BeanPostProcessor的解决方案是存在问题的.因此专门写此篇帖子分析why. 1.预备知识 aop概 ...

  4. C#实现JSON序列化与反序列化

    1.使用 JavaScriptSerializer类实现序列化 namespace: System.Web.Script.Serialization eg: // 序列化 private string ...

  5. Ubuntu 查询 so 归属的 package

    . . . . . 今天 LZ 在运行一个程序的时候,出现找不到 so 库的情况: >$ ./core ./core: error : cannot open shared object fil ...

  6. Failed opening .rdb for saving: Permission denied

    启动redis的账号权限不够.一般用root起. 参考:http://www.blogjava.net/liuyf8688/articles/403801.html

  7. C# 根据前台校验的值,决定是否执行后台方法

    <asp:Button ID="Add" runat="server" Text="加入" class="add" ...

  8. 转载:shell脚本之sed使用----替换、变量、转义字符

    sed替换的基本语法为:----s后面跟的是分隔符,原字符串可使用.*这种正则表达式进行整行替换 代码如下: sed 's/原字符串/替换字符串/' 单引号里面,s表示替换,三根斜线中间是替换的样式, ...

  9. MYSQL-5.5二进制包安装

    groupadd mysql 添加用户组 useradd mysql -s /sbin/nologin -g mysql -M  添加用户 mv mysql-5.5.54-linux2.6-x86_6 ...

  10. was部分更新

    在WAS中,应用的配置是从config/cells....目录下读取:而资源从/installedApps目录下读取 故当配置文件(例web.xml)发生改变时,只更新应用程序资源文件/install ...