单例模式的三个特点:
  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(){

    , 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(){
    , 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. JS单例设计模式

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

  2. SpringMvc 单例

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

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

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

  4. Javascript 设计模式 单例

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/30490955 一直很喜欢Js,,,今天写一个Js的单例模式实现以及用法. 1.单 ...

  5. java单例设计模式

    单例模式的特点: 1.单例类只能有一个对象(实例). 2.单例类必须自己创建自己的唯一实例 . 3.单例类必须给所有其他对象提供这一实例. 设置步骤: 1.将对象的应用成员变量用private来修饰. ...

  6. DBUtil数据库连接单例 —— 简单不简单

    单例大概是我最早产生明确模式意识的设计模式,因为它足够简单粗暴,目的足够明确. 单例么,就是不管怎么访问,都返回一个单一实例就好了,我最早应用在数据库的DBUtil中. public class DB ...

  7. SSH中Action的单例与多例

    Structs2中的Bean默认的是单例,在整个程序运行期间,每个Bean只有一个实例,只要程序在运行,这个实例就一直存在. 对于Action来说,单例就容易出问题.如果客户端每次提交的参数都是一样的 ...

  8. 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  9. static实现单例的隐患

    1. 前言 Java的单例有多种实现方式:单线程下的简单版本.无法在指令重排序下正常工作的Double-Check.static.内部类+static.枚举--.这篇文章要讨论的,是在使用static ...

随机推荐

  1. BZOJ1923: [Sdoi2010]外星千足虫

    传送门 高斯消元求解Xor方程. 这个方程很容易换成xor的方程.然后用高斯消元搞就行了. 用bitset实现这个非常方便. //BZOJ 1923 //by Cydiater //2016.11.3 ...

  2. SQL SERVER 2000通过链接服务器发送邮件出现错误

    案例环境: 服务器A系统: Windows Server 2000 数据库版本 : Microsoft SQL Server  2000 - 8.00.2282 (Intel X86) 服务器B系统: ...

  3. HTML5Canvas标签(https://developer.mozilla.org)

  4. Beam Search(集束搜索/束搜索)

    找遍百度也没有找到关于Beam Search的详细解释,只有一些比较泛泛的讲解,于是有了这篇博文. 首先给出wiki地址:http://en.wikipedia.org/wiki/Beam_searc ...

  5. angularJs基础

    AngularJs是为了克服Html在构建应用上的不足而设计的.Html是一门很好的为静态文件展示设计的声明式语言,但是要构建web应用的话就显得乏力了.所以我做了一些工作来让浏览器做我瞎向要的事. ...

  6. 使用HTML.ActionLink实现一个图片链接

    学习ASP.NET MVC 的Razor的语法,尝试把一段普能的图片链接<a ...><img ... />改为HTML.ActionLink实现. 最原始的代码: <a ...

  7. Atitit.病毒木马的快速扩散机制原理nio&#160;内存映射MappedByteBuffer

    Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...

  8. Mongodb副本集搭建经验

    一.环境配置经验 1.一般安装的副本集的时候,主实例可以有数据库和用户:从实例不能.仲裁机不能有任何数据库包括用户 2.搭建副本集的时候Host使用外网IP,否则使用Mongodb VUE 1.6.9 ...

  9. [jquery]判断页面滚动到顶部和底部(适用于手机web加载)

    //判断页面滚动到顶部和底部 $(window).scroll(function(){ var doc_height = $(document).height(); var scroll_top = ...

  10. (源码)自己写的ScrollView里套漂亮的圆角listview(算是漂亮吧。。。)

    找了相关的资料终于写完了: http://blog.csdn.net/jamin0107/article/details/6973845 和 http://emmet1988.iteye.com/bl ...