一、定义
设计模式的定义是:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决 方案,通俗一点说,设计模式是在某种场合下对某个问题的一种解决方案。如果再通俗一点说,设计模式就是给面向对象软件开发中的一些好的设计取个名字。也就是说设计模式并不难,而只是一些目前公认的解决某些问题的最佳实现而已。
1. 单例模式
单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。例如:线程池,全局缓存,浏览器window对象等,这些都只需要一个对象实例就足够了。
1.1 实现单例模式
要实现单例模式也并不复杂,只要用一个变量来标识是否已经给某个类创建过实例,如果是,则在下一次获取该类的实例的时候,直接返回已经缓存好的实例, 否则创建并缓存这个实例。
1.单例模式实现一
// 单例模式实现一
function SingleTon(name) {
this.name = name;
this.instance = null;
}
SingleTon.prototype.getName = function() {
return this.name;
}
SingleTon.getInstance = function(name) {
if (this.instance) {
return this.instance;
}
return new SingleTon(name);
}
复制代码
- 单例模式实现二, 利用闭包
// 单例模式实现二, 利用闭包
function SingleTon2(name) {
this.name = name;
}
SingleTon2.getInstance = (function(){
let instance = null;
return function(name) {
if (!instance) {
instance = new SingleTon2(name);
}
return instance;
}
})();
复制代码
- 实现三, 利用类
// 实现三 类
class SingleTon3 {
constructor(props) {
const { name, ...other } = props;
this.name = name;
this.instance = null; // 标识是否已经创建过实例
}
setName = () => {
return this.name;
}
static getInstance = (name) => {
this.instance = this.instance ? this.instance : new SingleTon3(name);
return this.instance;
}
}
const t1 = SingleTon3.getInstance('timo1');
const t2 = SingleTon3.getInstance('timo2');
console.log('t1 => ',t1); // timo1
console.log('t2 => ',t2); // timo1
console.log('t1 === t2 => ',t1 === t2); // true
复制代码
注意: 类(class)通过static关键字定义静态方法。不能在类的实例上调用静态方法,而应该通过类本身调用。这些通常是实用程序方法,例如创建或克隆对象的功能
4.衍生, 使用闭包来封装私有变量
// 使用闭包来封装私有变量
const user = (function() {
let name = 'timo';
let age = 22;
return {
getUserInfo: function() {
return name + ' '+ age;
}
};
})();
复制代码
特别注意:let 和 const 声明并不会绑定到全局的window对象上!!!而使用var声明会自动绑定到window
总结:
单例模式是一种简单但非常实用的模式,特别是惰性单例技术,在合适的时候才创建对象,并且只创建唯一的一个。
转载于:https://juejin.im/post/5cfa1f2be51d45773d4685da