js设计模式-单例模式

js设计模式-单例模式

什么是单例模式?简单的来说就是这个类的实例就只有一个,在简单点说的话:
   假设 有一个类叫 CreateClass 当每次使用new操作符 去new它(CreateClass)时得到实例都是同一个实例;

function Single (name){
	this.name = name;
};

Single.prototype.getName = function(){
	console.log(this.name)
};

Single.getInstance = (function(){
	let instance = null;
	return function(name){
		if(instance){
			return instance;
		}else{
			return new Single(name)
		}
	};
})()

var s1 = Single.getInstance();
var s2 = Single.getInstance();
console.log(s1 === s2); // true

上述就是一个简单的单例模式,但是上述单例有个问题就是我创建实例不是用new关键字了而是用getInstance方法进行创建 但其他人使用时必须知道Single是个单例模式创建实例必须用Single.getInstance方法创建;

1.透明单例模式

let Single = (function(){
	let instance = null; 
	let Instance = function (name) {
        if (instance) {
            return instance ;
        } else {
            this.name = name;
            return (instance = this);
        }
    }
    Instance.prototype.getName=function () {
        console.log(this.name);
    }
	return Instance;
})();

let single1 = new Single('aaa');
let single2 = new Single('aaa');
single1.getName();
console.log(single1 === single2);

这样就可以直接new来产生实例了,但是上述方法违反了设计模式的单一职责的原则。

let Instance = function (name) {
	this.name = name;
};

Instance.prototype.getName = function () {
	console.log(this.name);
};

let Single = (function(){
	let instance = null; 
	return function(name){
		if(!instance){
			instance = new Instance(name);
		}
		return instance;
	};
})();

let single1 = new Single('aaa');
let single2 = new Single('aaa');
single1.getName();
console.log(single1 === single2);

这样就将构造函数抽离出来了,但是Single中把new Instance(name);写死了当我有其他的单例要产生是怎么办。

function Instance(name) {
    this.name = name;
}
Instance.prototype.getName = function () {
    console.log(this.name);
}

let createSingle = function (Constructor) {
    let instance;
    let SingleConstructor = function () {
        if (!instance) {
            instance = new Constructor(...arguments);
        }
        return instance;
    }
    return SingleConstructor;
};

let A = createSingle(Instance);
let a1 = new A('1111')
let a2 = new A('1111');
a1.getName();
console.log(a1 === a2);

这样就可以创建多个不同类型的单例了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值