单例是一种 OOP 模式,您只想创建对象的单个实例,然后可以重用。
例如,假设我们有以下DatabaseConnection
类,我们想确保我们的同事只使用该类的 1 个实例:
class DatabaseConnection { private static connection: DatabaseConnection; private todos: string[] = []; private constructor(private url: string) {} static getConnection() { if (this.connection) { return this.connection; } this.connection = new DatabaseConnection('localhost:123'); return this.connection; } addTodo(text: string) { this.todos.push(text); } getTodos() { return this.todos; } } const dc1 = DatabaseConnection.getConnection(); const dc2 = DatabaseConnection.getConnection(); console.log(dc1 === dc2); // true dc1.addTodo('walk the dog'); console.log(dc1.getTodos()); // Can't call, new DatabaseConnection(), because the constructor is private // const dc3 = new DatabaseConnection()
我们可以在上面的代码片段中看到,创建
DatabaseConnection
类实例的唯一方法是使用静态getConnection
方法。这样我们可以确保 API 的使用者只能创建该类的单个实例,因为我们的构造函数是私有的,因此不能使用new
关键字实例化该类。