单例模式

本文介绍了单例模式的概念及其在JavaScript中的实现方式。单例模式能够确保一个类只有一个实例,并提供一个全局访问点。文章还提供了如何创建单例模式的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单利模式提供了一种将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一变量进行访问。

单利模式的优点是:

     可以用来划分命名空间,减少全局变量的数量

     使用单例模式可以使代码组织的更为一致,使代码容易阅读和维护。

     可以被实例化,且实例化一次。


什么是单利模式?

     单例模式就是一个用来划分命名空间并将一批属性和方法组织在一起的对象,,如果他可以被实例化,那么他只能被实例化一次。、。


定义一个对象字面量(结构类似于单例模式)的基本结构如下:

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

上面只是简单的字面量结构,上面的所有成员变量都是通过Singleton来访问的,但是他并不是单例模式,因为单利模式还有一个更重要的特点,就是可以仅被实例化,上面只是不能被实例化的一个类,因为不是单利模式,对象字面量是用来创建单利模式的一种方法;



单利模式如果要被实例化的话,那么只实例化一次,要实现一个单利模式的话,我们无非就是使用一个变量来标识该类是否被实例化,如果未被实例化的话,那么我们可以实例化一次,否则的话,直接返回已经实例化的对象


// 单体模式
var Singleton = function(name){
    this.name = name;
    this.instance = null;
};
Singleton.prototype.getName = function(){
    return this.name;
}
// 获取实例对象
function getInstance(name) {
    if(!this.instance) {
        this.instance = new Singleton(name);
    }
    return this.instance;
}
// 测试单体模式的实例
var a = getInstance("aa");
var b = getInstance("bb");

单利模式是只实例化一次,所以下面的实例是相等的

console.log(a === b)

     var Singleton = function (name) {
     	this.name = name;
     }
     Singleton.prototype.getName = function(){
     	return this.name;
     }
     //获取实例对象
     var getInstance = (function(){
        var instance = null;
        return function(name){
        	if(!instance){
        		instance = new Singleton(name);
        	}
        	return instance;
        }
     })();
     //测试单例模式的实例
     var a = getInstance("aa");
     var b = getInstance("bb");
     console.log(a === b);


// 创建div
var createWindow = function(){
    var div = document.createElement("div");
    div.innerHTML = "我是弹窗内容";
    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;
};
// 获取实例的封装代码
var getInstance = function(fn) {
    var result;
    return function(){
        return result || (result = fn.call(this,arguments));
    }
};
// 测试创建div
var createSingleDiv = getInstance(createWindow);
document.getElementById("Id").onclick = function(){
    var win = createSingleDiv();
    win.style.display = "block";
};
// 测试创建iframe
var createSingleIframe = getInstance(createIframe);
document.getElementById("Id").onclick = function(){
    var win = createSingleIframe();
    win.src = "http://cnblogs.com";
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值