Sunny-117/js-challenges

单例模式

LittlebearHat opened this issue · 2 comments

个人写法不习惯用class语法糖

const danli = function (name) {
  this.name = name;
  this.instance = null;
};
danli.prototype.getName = function () {
  console.log(this.name);
};
danli.getInstance = function (ret) {
  if (!this.instance) {
    this.instance = new danli(ret);
    //假如为null,创建一个构造函数,此时instance标记不为空,不用进行二次创建
  }
  return this.instance;
};
let a = danli.getInstance("a");
let b = danli.getInstance("b");
a.getName();
b.getName();
console.log(a === b); //他俩相同,因为没有二次创建

ES6 class实现

class Singleton {
    constructor(name, age) {
        if (!Singleton.instance) {
            this.name = name
            this.age = age
            Singleton.instance = this
        }
        return Singleton.instance
    }
}

console.log(new Singleton("Taobao", 18) === new Singleton("Baidu", 15)) // true
//创建型模式的一种
//保证一个类仅仅只有一个实例对象,并且提供一个对该实例对象的全局访问点
//保证全局只有一个实例,无论创建多少个实例对象,都始终指向同一个实例

//js方式实现
//借助辅助方法实现单例

function getSingle(fn) {
  let instance = null; // 用于存储单例实例的变量
  return function (...args) {
    // 返回一个新的函数,该函数接收任意数量的参数
    if (instance != null) {
      // 如果已经创建了实例
      return instance; // 直接返回这个实例
    } else {
      instance = new fn(...args); // 如果没有实例,使用提供的参数创建一个新的实例
      return instance; // 返回新创建的实例
    }
  };
}

class Person {
  constructor(name) {
    this.name = name;
  }
  greet() {
    return `hello ${this.name}`;
  }
}

const p1 = new Person();
const p2 = new Person();
console.log(p1 === p2);

const instPerson = getSingle(Person);
const p3 = new instPerson("Alice");
const p4 = new instPerson("Bob");
console.log(p3, p4);



export class Person {
  private name: string;
  private age: number;
  private static instance: Person;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  public static getInstance(name: string, age: number) {
    if (Person.instance === null) {
      Person.instance = new Person(name, age);
    } else {
      return Person.instance;
    }
  }
}
const p1 = Person.getInstance("tom", 18);
const p2 = Person.getInstance("tom2", 19);
console.log("====================================");
console.log(p1 === p2);
console.log("====================================");