js设计模式(一)---单例模式
之前有写过但是感觉不是很透彻---重新来过
单例模式:
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
应用场景:
如果一个对像只需要被创建一次的时候就需要单例模式,例如:线程池、全局缓存、浏览器中的widow对象等。
实现:
使用一个变量记录是否为某个类已经创建了对象,如果是,则在下次获取该类实例的时候。直接返回之前创建的对象。
// 单例模式 var Singleton = function(name){ this.name = name; this.instance = null; };// 获取实例对象 function getInstance(name) { if(!this.instance) { //一旦被实例化之后就不对其进行在实例化 this.instance = new Singleton(name); } return this.instance; } // 测试单例模式的实例 var a = getInstance("aa"); --->aa var b = getInstance("bb"); --->aa
console.log(a === b) //true
你会发现创建实例的逻辑和管理单例的逻辑放在了一起;这个不符合 “单一职责“ 的原则
我们改进下 使用代理的方式使用单例模式
var Singleton = function(name) { this.name = name; }; var getSingleton = (function() { var instance; return function(name) { if (!instance) { instance = new Singleton(name); } return instance; } })(); var a = new getSingleton('aa'); var b = new getSingleton('bb'); console.log(a === b) //true
虽然做了分离但是你会发现公共部分的代码还是存在
于是还而已改进为
var Singleton = function(name) { this.name = name; }; var getSingle = function( fn ){ var result; return function(){ return result || ( result = fn .apply(this, arguments ) ); } }; var createSingle = getSingle(Singleton) var a = createSingle('aa') var b = createSingle('bb') console.log(a == b)
如果你吧单例写到这种程度基本上也就差不多了
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步