概念
保证一个对象只会创建一个实例,并且会提供一个全局的访问点来访问这个实例
那么它表达了的含义就是:对于一个对象,即使你多次实例化,那么得到的实例也只有一个
场景
实现一个学生的信息管理的类(当然这个例子可能不太好)
普通对象
通过普通对象创建的,他们的实例是不一样的,所以你对其中一个改变,并不会影响其他的
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."(从同一个实例获取)
优点
- 全局状态管理:因为每次用的只有一个实例,所以你在任何一个地方的修改,都会直接影响全局