单例模式
LittlebearHat opened this issue · 2 comments
LittlebearHat commented
个人写法不习惯用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); //他俩相同,因为没有二次创建
vuemenow commented
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
dizao006 commented
//创建型模式的一种
//保证一个类仅仅只有一个实例对象,并且提供一个对该实例对象的全局访问点
//保证全局只有一个实例,无论创建多少个实例对象,都始终指向同一个实例
//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("====================================");