javascript实现单例模式附源码解析

来源:程序思维浏览:2344次
什么是单例模式?

单例模式也称作为单子模式,单体模式。单例模式的定义是产生一个类的唯一实例,是软件设计中较为简单但是很常用的一种设计模式。

单例模式的核心是确保只有一个实例,并提供全局访问。

javascript实现单例模式附源码解析

实现代码如下:

var SingleTon = function(name){ //创建一个对象
    this.name = name;
    this.instance = null;
};
SingleTon.prototype.getName = function(){
    alert(this.name);
};
SingleTon.getInstance = function(name){
   if(!this.instance){
        this.instance = new SingleTon(name);
    }
    return this.instance;
};

var a = SingleTon.getInstance( 'instance1' );
var b = SinleTon.getInstance( 'instance2' );

alert( a === b);  //返回true

上述代码虽然实现了单例模式,但实际运用中并不这样运用,请看下面代码。

1.直接创建一个对象实现单例模式

既然我们只要一个实例,我们可以很容易想到,直接创建一个对象不就行了。

// 对象字面量
var Singleton = {
    attr1: 1,
    attr2: 2,
    method1: function(){
        return this.attr1;
    },
    method2: function(){
        return this.attr2;
    }
};

//对象变量
var div = document.body.appendChild( document.createElement( ''div' ) );

不足之处:
(1)没有什么封装性,所有的属性方法都是暴露的。
(2)全局变量很容易造成命名空间污染。
(3)对象一开始变创建,万一我们用不上就浪费了。

2.实现惰性单例(利用闭包和立即执行函数来实现)

// 实现单体模式创建div
var createDiv= (function(){
    var div; 
    return function(){
        if(!div) {
            div = document.createElement("div");
            div.style.width = '100px';
            div.style.height = '100px';
            div.style.background = '#e4e4e4';
            document.body.appendChild(div);
        }
        return div;
    }
})();

var div1=createDiv();
var div2=createDiv();
console.log(div1===div2); //true

虽然我们完成了惰性单例,但是我们同样发现了问题

违反了单一职责原则,创建对象和管理单例放在了一个函数中createDiv
如果我们还想创建一个其他的唯一对象,那就只能copy了
综上,我们需要 :
把不变的部分隔离出来,把可变的封装起来,这给予了我们扩展程序的能力,符合开放-封闭原则

<div id='test1' style="height:200px;background-color: #333"></div>
<div id='test2' style="height:200px;background-color: #e3e3e3"></div>

<script>
// 获取单个实例
var getInstance = function(fn) {
    var result;
    return function(){
        return result || (result = fn.call(this,arguments));
    }
};
  // 创建div
var createWindow = function(){
    var div = document.createElement("div");
    div.innerHTML = "i am #div";
    div.style.display = 'none';
    document.body.appendChild(div);
    return div;
};
// 创建iframe
var createIframe = function(){
    var iframe = document.createElement("iframe");
    document.body.appendChild(iframe);
    return iframe;
};
// 测试创建div
var createSingleDiv = getInstance(createWindow);  //返回一个闭包,result 为null
document.getElementById("test1").onclick = function(){
    var win = createSingleDiv();
    win.style.display = "block";
};
// 测试创建iframe
var createSingleIframe = getInstance(createIframe); //返回一个闭包,result 为null
document.getElementById("test2").onclick = function(){
    var win = createSingleIframe();
    win.src = "https://www.imooc.com";
};
</script>

源码下载
精品好课
HTML5基础入门视频教程易学必会
HTML5基础入门视频教程,教学思路清晰,简单易学必会。适合人群:创业者,只要会打字,对互联网编程感兴趣都可以学。课程概述:该课程主要讲解HTML(学习HTML5的必备基础语言)、CSS3、Javascript(学习...
VUE2+VUE3视频教程从入门到精通(全网最全的Vue课程)
VUE是目前最火的前端框架之一,就业薪资很高,本课程教您如何快速学会VUE+ES6并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习VUE高薪就...
Vue2+Vue3+ES6+TS+Uni-app开发微信小程序从入门到实战视频教程
2021年最新Vue2+Vue3+ES6+TypeScript和uni-app开发微信小程序从入门到实战视频教程,本课程教你如何快速学会VUE和uni-app并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己...
HTML5视频播放器video开发教程
适用人群1、有html基础2、有css基础3、有javascript基础课程概述手把手教你如何开发属于自己的HTML5视频播放器,利用mp4转成m3u8格式的视频,并在移动端和PC端进行播放支持m3u8直播格式,兼容...
最新完整React视频教程从入门到精通纯干货纯实战
React是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习React高薪就...
最新完整React+VUE视频教程从入门到精,企业级实战项目
React和VUE是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React和VUE并应用到实战,教你如何解决内存泄漏,常用库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习Re...
jQuery视频教程从入门到精通
jquery视频教程从入门到精通,课程主要包含:jquery选择器、jquery事件、jquery文档操作、动画、Ajax、jquery插件的制作、jquery下拉无限加载插件的制作等等......
React实战视频教程仿京东移动端电商
React是前端最火的框架之一,就业薪资很高,本课程教您如何快速学会React并应用到实战,对正在工作当中或打算学习React高薪就业的你来说,那么这门课程便是你手中的葵花宝典。
收藏
扫一扫关注我们