理解JavaScript设计模式中的单例模式
作者:掘金安东尼
这篇文章主要介绍了理解JavaScript设计模式中的单例模式,单例模式即Singleton Pattern是最简单的设计模式之一,下文更多相关介绍感兴趣的小伙伴可以参考一下
单例模式(Singleton Pattern
)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
- 1、单例类只能有一个实例。
- 2、单例类必须自己创建自己的唯一实例。
- 3、单例类必须给所有其他对象提供这一实例。
这样做的缺点就是:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
优点则有:
- 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。
- 2、避免对资源的多重占用。
最简单的单例模式举例:
// 定义一个类 function Singleton(name) { this.name = name; this.instance = null; } // 原型扩展类的一个方法getName() Singleton.prototype.getName = function() { console.log(this.name) }; // 获取类的实例 Singleton.getInstance = function(name) { if(!this.instance) { this.instance = new Singleton(name); console.log(this.instance) // {name: 'a', instance: null} } return this.instance }; // 获取对象1 var a = Singleton.getInstance('a'); // 获取对象2 var b = Singleton.getInstance('b'); // 进行比较 console.log(a === b); // true
不过,这样写,不够直观,因为我们通常都是通过 new 来创建实例的;
所以,改写为:
// 单例构造函数 function CreateSingleton (name) { this.name = name; this.getName(); }; // 获取实例的名字 CreateSingleton.prototype.getName = function() { console.log(this.name) }; // 单例对象 var Singleton = (function(){ var instance; return function (name) { if(!instance) { instance = new CreateSingleton(name); } return instance; } })(); // 创建实例对象1 var a = new Singleton('a'); // 创建实例对象2 var b = new Singleton('b'); console.log(a===b);
到此这篇关于理解JavaScript设计模式中的单例模式的文章就介绍到这了,更多相关JS单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!