翼度科技»论坛 编程开发 JavaScript 查看内容

创建型-单例模式

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
什么是单例模式

  单例模式 (Singleton Pattern)又称为单体模式,保证一个类只有一个实例,并提供一个访问它的全局访问点。也就是说,第二次使用同一个类创建新对象的时候,应该得到与第一次创建的对象完全相同的对象。
 简单的说就是保证一个类仅有一个实例,并提供一个访问它的全局访问点,这样的模式就叫做单例模式。

单例模式的实现思路

现在我们先不考虑单例模式的应用场景,单看它的实现,思考这样一个问题:如何才能保证一个类仅有一个实例?
一般情况下,当我们创建了一个类(本质是构造函数)后,可以通过new关键字调用构造函数可以生成任意多的实例对象,像这样:
  1. class Single {
  2.     show() {
  3.         console.log('我是一个单例对象')
  4.     }
  5. }
  6. const s1 = new Single()
  7. const s2 = new Single()
  8. // false
  9. s1 === s2
复制代码
先 new 了一个 s1,又 new 了一个 s2,很明显 s1 和 s2 之间没有任何瓜葛,两者是相互独立的对象,各占一块内存空间。而单例模式想要做到的是,不管我们尝试去创建多少次,它都只给你返回第一次所创建的那唯一的一个实例
要做到这一点,就需要构造函数具备判断自己是否已经创建过一个实例的能力,那么只要用一个变量保存创建的实例,后面判断这个变量即可。
js实现
  1. // es6
  2. class SingletonApple {
  3.   static instance = null;
  4.   constructor(name, creator, products) {
  5.     this.name = name;
  6.     this.creator = creator;
  7.     this.products = products;
  8.     if (!SingletonApple.instance) {
  9.       SingletonApple.instance = this;
  10.     }
  11.     return SingletonApple.instance;
  12.   }
  13.   //静态方法
  14.   static getInstance(name, creator, products) {
  15.     if (!this.instance) {
  16.       this.instance = new SingletonApple(name, creator, products);
  17.     }
  18.     return this.instance;
  19.   }
  20. }
  21.   console.log(SingletonApple.instance);
  22.   let ss = new SingletonApple("苹果公司", "阿辉",
  23.                               ["iPhone", "iMac", "iPad", "iPod"]);
  24.   console.log(ss);
  25.   console.log(ss === SingletonApple.instance);
  26.   let appleCompany = SingletonApple.getInstance("苹果公司", "乔布斯", [
  27.     "iPhone",
  28.     "iMac",
  29.     "iPad",
  30.     "iPod"
  31.   ]);
  32.   let copyApple = SingletonApple.getInstance("苹果公司", "阿辉", [
  33.     "iPhone",
  34.     "iMac",
  35.     "iPad",
  36.     "iPod"
  37.   ]);
  38.   console.log(appleCompany === copyApple); //true
  39. // 闭包-通过自执行函数创建闭包变量
  40. const Singleton = (function () {
  41.     const SingleClass = function (name, creator, products) {
  42.       this.name = name;
  43.       this.creator = creator;
  44.       this.products = products;
  45.     };
  46.     let instance = null;
  47.     return function (name, creator, products) {
  48.       if (!instance) {
  49.                 // 如果不存在 则new一个
  50.           instance = new SingleClass(name, creator, products)
  51.       }
  52.       return instance;
  53.     }
  54. })()
  55. let s1 = new Singleton("单例1", "阿辉1", [
  56.   "iPhone",
  57.   "iMac",
  58.   "iPad",
  59.   "iPod"])
  60. let s2 = new Singleton("单例2", "阿辉2", [
  61.   "iPhone",
  62.   "iMac",
  63.   "iPad",
  64.   "iPod"])
  65. console.log(s1 === s2)
  66. console.log(s1)
复制代码
注意点


  • 确保只有一个实例
  • 并提供全局访问

来源:https://www.cnblogs.com/longbensong/p/17188740.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具