Skip to content

概念

保证一个对象只会创建一个实例,并且会提供一个全局的访问点来访问这个实例

那么它表达了的含义就是:对于一个对象,即使你多次实例化,那么得到的实例也只有一个

场景

实现一个学生的信息管理的类(当然这个例子可能不太好)

普通对象

通过普通对象创建的,他们的实例是不一样的,所以你对其中一个改变,并不会影响其他的

typescript
class studentState {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  getName() {
    return this.name;
  }

  setName(name: string) {
    this.name = name;
  }

  getAge() {
    return this.age;
  }

  setAge(age: number) {
    this.age = age;
  }

  sayHello() {
    return `Hello, I am ${this.name}, ${this.age} years old.`;
  }
}

const student = new studentState('John', 20);
console.log(student.getName()); // 输出: "John"
console.log(student.getAge()); // 输出: 20
console.log(student.sayHello()); // 输出: "Hello, I am John, 20 years old."

student.setName('Alice');
student.setAge(22);
console.log(student.getName()); // 输出: "Alice"
console.log(student.getAge()); // 输出: 22
console.log(student.sayHello()); // 输出: "Hello, I am Alice, 22 years old."

单例模式

所有对实例的修改都会影响到全局实例的使用,因为我们使用的是一个实例

typescript
class studentStateSingleton {
  // 一个flag用来标记是否已经实例化
  private static instance: studentStateSingleton;
  private name: string;
  private age: number;
  private constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  static getInstance(name: string, age: number) {
    if (!this.instance) {
      this.instance = new studentStateSingleton(name, age);
    }
    return this.instance;
  }

  getName() {
    return this.name;
  }

  setName(name: string) {
    this.name = name;
  }

  getAge() {
    return this.age;
  }

  setAge(age: number) {
    this.age = age;
  }

  sayHello() {
    return `Hello, I am ${this.name}, ${this.age} years old.`;
  }
}

const student1 = studentStateSingleton.getInstance('John', 20);
console.log(student1.sayHello()); // 输出: "Hello, I am John, 20 years old."

const student2 = studentStateSingleton.getInstance('Alice', 22);
console.log(student2.sayHello()); // 输出: "Hello, I am John, 20 years old."(从同一个实例获取)

student1.setName('Bob');
student1.setAge(25);
console.log(student1.getName()); // 输出: "Bob"
console.log(student1.getAge()); // 输出: 25
console.log(student1.sayHello()); // 输出: "Hello, I am Bob, 25 years old."

console.log(student2.getName()); // 输出: "Bob"(从同一个实例获取)
console.log(student2.getAge()); // 输出: 25(从同一个实例获取)
console.log(student2.sayHello()); // 输出: "Hello, I am Bob, 25 years old."(从同一个实例获取)

优点

  • 全局状态管理:因为每次用的只有一个实例,所以你在任何一个地方的修改,都会直接影响全局