单列
保证客户程序不会通过new()操作产生一个实例
C#
经典的单列写法
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton GetInstance(){
if (instance == null) {
instance = new Singleton ();
}
return instance;
}
}
这里面不得不说,多线程这个货,简直丧良心了,为啥呢——
在这种经典模式下,没有考虑线程并发获取实例问题,即可能出现两个线程同时获取instance实例,且此时其为null时,就会出现两个线程分别创建了instance,违反了单例规则。
改进型
public class Singleton {
private static Singleton instance;
private static object _lock = new object();
private Singleton() { }
public static Singleton GetInstance() {
if(instance==null) {
lock(_lock) {
if(instance==null) {
instance=new Singleton();
}
}
}
return instance;
}
}
假如线程A和线程B同时执行上段代码,A执行要快0.1s,那么会优先执行lock。判断是_lock是否申请的了互斥锁,没有申请的情况下,再判断有没有实例化。
线程B在0.1s后执行的时候,发现已近 _lock已经申请了互斥锁,只能等待A执行完成,A在执行的时候已经完成了实例化,那么B只要返回就可以。这样就不会出现分别实例化的现象了。
javaScript
js有一点尴尬,就是他没有类的概念(这里下面的代码用的是非ES6),我们姑且把一个function当成一个类来看
我们写一个简单的,点击一个按钮生成一个弹框
//html
<button id="popup">btn</button>
//js
var createPopups = (function () {
var div;
return function () {
if (!div) {
div = document.createElement('div');
div.innerHTML = '生成弹窗';
div.style.display = 'none';
document.body.appendChild(div);
}
return div;
}
})();
document.getElementById('popup').onclick = function () {
var popupInstance = createPopups();
popupInstance.style.display = 'block';
}
其实我们也可以做一个隐藏的,主要看需求了,还有个人喜好。。。
网友评论