JS设计模式大合集

仓库地址:JS设计模式大合集
欢迎大家 Star ,一起交流学习!

JS设计模式-单列模式

单列模式(Singleton pattern)是一种常见的设计模式,用于限制一个类只能有一个实例,并提供一个全局访问点来获取这个唯一实例。换言之,你只能创建一个特定类的对象。如果你尝试创建一个已存在的实例,那么它将始终返回你已创建的那个实例。
这种模式特别适合需要保持状态的场合,例如

  • 数据库连接
  • 日志记录
  • VUEX
  • 或者任何其他可能需要多个地方更新的数据

来写一个单列模式吧

如我们上面所说,单列模式只有一个实例,并且提供一个全局的访问点来访问获取这个唯一实例。因此,也就是私有属性。在js中,我们可以利用闭包来做私有属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
type myInstance = {
name: string;
showMessage: () => void;
};

const Singleton = (function () {
let _instance: myInstance;

function createInstance(): myInstance {
// 创建实例的代码
return {
// 定义了一个实例的属性和方法
name: "chuyuxuan0v0",
showMessage: () => {
console.log("Hello , This is a Singleton of chuyuxuan0v0!");
}
};
}

return {
getInstance: function () {
// 如果实例不存在,则创建一个新实例;否则直接返回现有实例
if (!_instance) {
_instance = createInstance();
}
return _instance;
}
};
})();

// 使用示例
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 === instance2); // 输出 true,说明两个变量引用的是同一个实例
instance1.showMessage(); // 输出 "Hello from Singleton!"


当然,我们也可以采用ES6(ECMAScript 2015)中的class来处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

class SingletonClass { // 定义一个类
private static instance: SingletonClass; // 定义一个静态属性,用于存储单例实例
public name: string | null; // 定义一个公共属性
public showMessage: () => void;
// 私有化构造函数,防止外部通过 new 关键字创建实例,以确保只有一个实例存在,并且控制实例化的方式
private constructor(name: string | null, fuc: () => void) {
// 定义共属性的
this.name = name;
this.showMessage = fuc;
}

// 提供了一个静态方法,用于获取单例实例
public static getInstance(): SingletonClass {
// 如果实例不存在,则创建一个新实例;否则直接返回现有实例
if (!SingletonClass.instance) {
SingletonClass.instance = new SingletonClass('chuyuxuan0v0', () => {
console.log("Hello , This is a SingletonClass of chuyuxuan0v0!");
});
}
return SingletonClass.instance;
}


}

// Usage:
const singleton1 = SingletonClass.getInstance();
const singleton2 = SingletonClass.getInstance();

console.log(singleton1 === singleton2); // 输出: true
console.log(singleton2.name); // 输出: "chuyuxuan0v0"
singleton1.showMessage(); // 输出: "Hello , This is a SingletonClass of chuyuxuan0v0!"

结束语

单列设计模式算是最简单的设计模式了,它带来的好处如下:

  1. 确保只有一个实例: 单例模式确保一个类只有一个实例存在。这对于那些需要且只能有一个实例的类非常有用,比如配置信息、日志记录器等。通过单例模式,可以防止多个实例导致的资源浪费或不一致性问题。
  2. 全局访问点: 单例模式提供了一个全局访问点来访问唯一的实例。这样其他类可以轻松地访问单例实例,而不必担心实例化的细节。
  3. 延迟实例化: 单例模式允许在需要时才实例化对象,而不是在应用程序启动时立即实例化。这种延迟实例化的方式可以节省资源,并提高应用程序的性能。
  4. 避免全局变量污染: 单例模式将实例封装在类内部,避免了全局变量的污染。这有助于保持代码的清晰度和可维护性。
  5. 简化了对象管理: 单例模式简化了对象的管理,因为它只有一个实例。这减少了对象之间的耦合性,并使得代码更容易理解和维护。

通过这些,我们能更好的维护自己的代码。