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中单例模式的实现方式有多种,每一种都有自身的优点或缺点。 ,对象直接量实现最基本,最简单的单体 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 单例的更多相关文章
- Highcharts error #16: www.highcharts.com/errors/16 js 单例
一.问题项目某一个页面用的highcharts用来显示一张图表,第一次刷新正常,第二次就出来这个错.1二.解决问题过程在网上找了很多同样是这个错误的解决方案. 第一:加载了highstock.js然后 ...
- JS单例设计模式
单例,指的是只有一个实例的对象. 在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为.比如在整个系统的配置文件中,配置 ...
- JS单例对象与构造函数对象的区别
JavaScript对象有几种: 内置对象如Global,Math对象等等. 本地对象如Object.Function.Array.String.Boolean.Number.Date.RegExp. ...
- JS单例
s = (function S(){ var bean; function get(){ if(bean){ return bean }else{ bean = T(); return bean; } ...
- js之单例
所谓单例,指的是只有一个实例的对象. js通过对象字面量的方式来创建单例对象. var sig = { name:value, method:function(){ } }
- js的单例
对于 JS 来说,巨大的灵活性使得其可以有多种方式实现单例模式,使用闭包方式来模拟私有数据,按照其思路可得: var single = (function(){ var unique; functi ...
- js实现单例
单例无外乎每次调用返回的都是同一个对象,可以利用闭包实现 function Singleton(){ this.data = "singleton"; } Singleton.ge ...
- SpringMvc 单例
struts2的controller是多例,是因为其中有modeldriven将比如user 或者其他属性暴露出来,接受属性,特别是继承了actionsupport之后,fielderror的属性也会 ...
- javascript学习(9)——[设计模式]单例
单例模式,相信大家对此都不陌生,我们主要讲下javascript中几个比较常见的设计模式: (1).普通的单体 (2).具有局部变量的强大单体 (3).惰性单体 (4).分支单体 下面我们就一一进行介 ...
随机推荐
- android开发——学习总结20131204
android:launchMode,即Activity的启动模式,与Intent中的Flags共同作用,决定Activity如何启动. android:launchMode分别有"stan ...
- ios 中 documents和library 的区别
简单来说就是用户在APP中输入并保存的数据放在Documents文件夹中(如用户输入的文本等), 并且如果手机连接电脑时,iTunes会自动备份其中文件,苹果不允许我们将下载的大型文件放入该文件夹. ...
- sql一个表中两个字段合并求和
sql一个表中两个字段,合并求和 SELECT SUM(字段a+'.'+字段b) as total from TABLE
- 全是套路——BFS
#include <iostream> #include <vector> #include <string> #include <vector> #i ...
- 在JSP中使用JavaBean
//创建一个PersonBean类 public class PersonBean { private String name; private int age; public Pe ...
- selenium—八种定位方法
find_element_by_id() find_element_by_name() find_element_by_class_name() find_element_by_tag_name() ...
- java file类的常用方法和属性
1 常用方法 a.createNewFile方法 public boolean createNewFile() throws IOException 该方法的作用是创建指定的文件.该方法只 ...
- git 创建远程分支和删除 master 分支
. . . . . 最近需要将不同的客户的代码分开管理,所以需要为这些代码分别创建分支. 目前版本库中分支结构如下: [yuhuashi@local:Project]$ git branch -a* ...
- UDP异步通信
先看效果图 Server: using System; using System.Collections.Generic; using System.Text; using System.Net; u ...
- 16.10.18学到的Java知识
1. 突然间发现自己忘了关于自增自减运算符放在变量前后的区别是什么了? 于是乎,我查了资料. 如果只对自变量进行加1或减1的时候,放在前面和后面都是没有区别的. 但是,如果自增自减运算符使用在需要赋值 ...