AllonBlog

一步一个脚印

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

C# JS 单例

单例模式的三个特点:
  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中单例模式的实现方式有多种,每一种都有自身的优点或缺点。 

1,对象直接量实现最基本,最简单的单体

var Singleton = {
    attr1 : 1,
    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 = 1, 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 = 1, 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();

 

posted on   AllonBlog  阅读(229)  评论(0编辑  收藏  举报

编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
点击右上角即可分享
微信分享提示