文文文文文文文 发表于 2023-3-7 18:21:54

创建型-单例模式

什么是单例模式

  单例模式 (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)注意点


[*]确保只有一个实例
[*]并提供全局访问

来源:https://www.cnblogs.com/longbensong/p/17188740.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 创建型-单例模式