细品 javascript 设计模式(单利模式)
2020/6/20 8:25:40
本文主要是介绍细品 javascript 设计模式(单利模式),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
我尽量用最少的文字,最少的篇幅,讲明白设计模式的方方面面。
文章连接
理解单利模式
确保只有一个实例,并提供全局访问。 例如 redux 中的 store,线程池,全局缓存,浏览器 window 对象等。
上代码:通用的惰性单利模式
let getSingle = function(fn) { let result = 'initial_single'; return function() { if (result === 'initial_single') { result = fn.apply(this, arguments); } return result; } } // 测试 ----- let Tree = function() { console.log('something') } let getSingleTree = getSingle(Tree) getSingleTree() // 第一次调用时输出:console.log('something') getSingleTree() // getSingleTree() // // 调用三次只会输出一次
单利模式的演进过程
1. 普通单利
用变量来标记某个对象是否被创建过,如果是直接返回之前创建的变量
上代码:
let Person = function(name) { this.name = name } Person.prototype.getName = function() { console.log(this.name) } Person.getSingle = (function() { let instance = null; return function(name) { if (!instance) { instance = new Person(name) } return instance } })();
2. 透明单利
有一个类,不论你 new 多少次。它都给你返回第一次 new 的那个实例。这就是透明的单利模式,所谓透明,就是你不能看出它是单利。
上代码:
let Person = (function() { let instance; Person = function(name) { if (instance) { return instance; } this.name = name; return instance = this; } return Person; })(); let p = new Person('C#') let a = new Person('java') console.log(p === a) // true
3. 用代理实现单利
之前的单利实现都有一个共同的问题:类和单利的代码都交织在一起。这样有违反“单一职能”原则。
代理,就是把类应该做的事,和单利应该做的事情分开
上代码:
// 类 var Person = function(name) { this.name = name; } // 代理 let ProxySinglePerson = (function() { let result; return function(name) { if (result) { return result } result = new Person(name) return result } })(); let p = new ProxySinglePerson('C#') let a = new ProxySinglePerson('java') console.log(p === a) // true
5. 惰性单利
意思是,需要用到的时候才创建。这是单利模式的应用中非常重要的一点。 其实之前的代码中也已经包含了惰性单利,看下面代码。重点关注“惰性”。
上代码:
// 类 var Person = function(name) { this.name = name; } Person.getSingle = (function() { let instance; return function(name) { if (!instance) { instance = new Person(name); } return instance; } })(); var p = Person.getSingle('C#') var a = Person.getSingle('java') console.log(p === a) // true
6. 通用的惰性单利
一劳永逸,这次咱们完成一个通用的惰性单利。也就是文章开头的那段代码
let getSingle = function(fn) { let result = 'initial_single'; return function() { if (result === 'initial_single') { result = fn.apply(this, arguments); } return result; } }
小结
本章学习了单利模式的演进过程,还提到了代理模式和单一职责原则。之后的文章里我会对他们做详细的讲解。
在 getSingle 函数中,也提到了闭包和高阶函数的概念。单利模式是一种非常实用的模式,特别是惰性单利技术,在合适的时候才创建对象,并且全局唯一。更奇妙的是创建对象和管理单利的职责被分布在两个不同的方法中,这两个方法组合起来才有单利模式的威力。
这篇关于细品 javascript 设计模式(单利模式)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-06小米11i印度快充版ROM合集:极致体验,超越期待
- 2024-10-06【ROM下载】小米11i 5G 印度版系统, 疾速跃迁,定义新速度
- 2024-10-06【ROM下载】小米 11 青春活力版,青春无极限,活力全开
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求