创建型-单例模式
什么是单例模式
单例模式 (Singleton Pattern)又称为单体模式,保证一个类只有一个实例,并提供一个访问它的全局访问点。也就是说,第二次使用同一个类创建新对象的时候,应该得到与第一次创建的对象完全相同的对象。
简单的说就是保证一个类仅有一个实例,并提供一个访问它的全局访问点,这样的模式就叫做单例模式。
单例模式的实现思路
现在我们先不考虑单例模式的应用场景,单看它的实现,思考这样一个问题:如何才能保证一个类仅有一个实例?
一般情况下,当我们创建了一个类(本质是构造函数)后,可以通过new关键字调用构造函数可以生成任意多的实例对象,像这样:
class Single { show() { console.log('我是一个单例对象') } } const s1 = new Single() const s2 = new Single() // false s1 === s2
先 new 了一个 s1,又 new 了一个 s2,很明显 s1 和 s2 之间没有任何瓜葛,两者是相互独立的对象,各占一块内存空间。而单例模式想要做到的是,不管我们尝试去创建多少次,它都只给你返回第一次所创建的那唯一的一个实例。
要做到这一点,就需要构造函数具备判断自己是否已经创建过一个实例的能力,那么只要用一个变量保存创建的实例,后面判断这个变量即可。
js实现
// es6 class SingletonApple { static instance = null; constructor(name, creator, products) { this.name = name; this.creator = creator; this.products = products; if (!SingletonApple.instance) { SingletonApple.instance = this; } return SingletonApple.instance; } //静态方法 static getInstance(name, creator, products) { if (!this.instance) { this.instance = new SingletonApple(name, creator, products); } return this.instance; } } console.log(SingletonApple.instance); let ss = new SingletonApple("苹果公司", "阿辉", ["iPhone", "iMac", "iPad", "iPod"]); console.log(ss); console.log(ss === SingletonApple.instance); let appleCompany = SingletonApple.getInstance("苹果公司", "乔布斯", [ "iPhone", "iMac", "iPad", "iPod" ]); let copyApple = SingletonApple.getInstance("苹果公司", "阿辉", [ "iPhone", "iMac", "iPad", "iPod" ]); console.log(appleCompany === copyApple); //true // 闭包-通过自执行函数创建闭包变量 const Singleton = (function () { const SingleClass = function (name, creator, products) { this.name = name; this.creator = creator; this.products = products; }; let instance = null; return function (name, creator, products) { if (!instance) { // 如果不存在 则new一个 instance = new SingleClass(name, creator, products) } return instance; } })() let s1 = new Singleton("单例1", "阿辉1", [ "iPhone", "iMac", "iPad", "iPod"]) let s2 = new Singleton("单例2", "阿辉2", [ "iPhone", "iMac", "iPad", "iPod"]) console.log(s1 === s2) console.log(s1)
如果您觉得阅读本文对您有帮助,请点一下推荐按钮,您的推荐将是我最大的写作动力,欢迎各位转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!