Skip to content

什么是单例模式?

单例模式(Singleton Pattern)是简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

简单的说就是不管实例多少次,最终返回的是首次的实例对象; 单例模式不仅减少了内存的开销, 并且解决了一部分在全局变量中冲突的问题。

单例模式确保一个类只有一个实例存在。举个例子说: 一个班只有一名班主任, 而对于这个问题就是一个简单的介绍,同一个班级可以有多个老师,但是只有一个班主任,所以这个班主任就是单例模式。

简单的单例模式

js
const time_tool = {
	title: "时间处理方法",
	getTime: function () {},
	getDate: function () {},
	getYear: function () {},
};

上面的例子就是以为字面量的形式创建一个封装时间的处理工具,同时暴露出一个全局的变量time_tool,在使用的时候只需要调用time_tool.getTime()即可。time_tool就是单例模式的体现,在创建对象的方式实例化了一个对象, 并且const定义的变量是不能修改以及重复存在的;

构造函数与立即执行函数表达式

js
const Singleton = (function () {
	let instance;

	function init() {
		function privateMethod() {
			console.log("私有");
		}
		return {
			publicMethod: function () {
				console.log("公有");
				privateMethod();
			},
		};
	}

	return {
		getInstance: function () {
			if (!instance) {
				// 创建
				instance = init();
			}
			return instance;
		},
	};
})();
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1, instance2);
console.log(instance1 === instance2);

使用模块模式

js
const SingletonModule = (function () {
	let instance;

	function Singleton() {
		// 私有属性和方法
		const privateVar = "I am private";

		this.publicMethod = function () {
			console.log("Public Method");
			console.log(privateVar);
		};
	}

	return {
		getInstance: function () {
			if (!instance) {
				instance = new Singleton();
			}
			return instance;
		},
	};
})();

// 使用单例
const singletonInstance1 = SingletonModule.getInstance();
const singletonInstance2 = SingletonModule.getInstance();
console.log(singletonInstance1 === singletonInstance2); // 输出: true

使用 ES6 的类和静态属性

js
class SingletonClass {
	static instance = null;

	constructor() {
		if (!SingletonClass.instance) {
			SingletonClass.instance = this;
			// 初始化操作
		}
		return SingletonClass.instance;
	}

	publicMethod() {
		console.log("Singleton Class Public Method");
	}
}

// 使用单例
const singletonInstance1 = new SingletonClass();
const singletonInstance2 = new SingletonClass();

console.log(singletonInstance1 === singletonInstance2); // 输出: true

单例模式的实现方式有很多种,如使用字面量,使用构造函数,使用立即执行函数表达式,使用模块模式,使用 ES6 的类和静态属性等。

wangxiaoze | MIT License.