阅读量:2
简介
单例模式(Singleton Pattern)是一种设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这在某些情况下非常有用,比如需要一个唯一的配置管理器、日志记录器、或资源管理器。
单例模式的特点
- 唯一实例:类内部维护一个唯一实例,确保类的实例只有一个。
- 全局访问点:提供一个全局访问点,以便其他类可以通过这个访问点获取该实例。
- 延迟实例化:可以延迟创建实例,直到第一次使用时才进行实例化(懒汉模式)。
实现单例模式
饿汉模式
这种方法在类加载时就创建实例,比较简单,但如果实例占用资源较大而且在实际运行中未使用,会造成资源浪费。
class Singleton { private static instance: Singleton = new Singleton(); private constructor() { } public static getInstance(): Singleton { return Singleton.instance; } public someMethod() { console.log('Singleton method called.'); } } // 使用 const singleton = Singleton.getInstance(); singleton.someMethod();
懒汉模式
这种方法在第一次调用 getInstance
方法时才创建实例,适合需要延迟加载的情况。
class Singleton { private static instance: Singleton; private constructor() { } public static getInstance(): Singleton { if (!Singleton.instance) { Singleton.instance = new Singleton(); } return Singleton.instance; } public someMethod() { console.log('Singleton method called.'); } } // 使用 const singleton = Singleton.getInstance(); singleton.someMethod();
线程安全的懒汉模式
在多线程环境中,需要确保实例创建的线程安全性。
class Singleton { private static instance: Singleton; private static lock = new Object(); private constructor() { } public static getInstance(): Singleton { if (!Singleton.instance) { synchronized (Singleton.lock) { if (!Singleton.instance) { Singleton.instance = new Singleton(); } } } return Singleton.instance; } public someMethod() { console.log('Singleton method called.'); } } // 使用 const singleton = Singleton.getInstance(); singleton.someMethod();
单例模式的优缺点
优点:
- 控制实例数量:确保类只有一个实例,节省资源。
- 全局访问:提供全局访问点,方便访问实例。
- 延迟加载:可以实现延迟加载,减少不必要的资源消耗。
缺点:
- 扩展性差:单例类难以扩展,尤其是在需要子类化的情况下。
- 多线程问题:在多线程环境下,需要小心处理实例创建的线程安全问题。
- 隐藏依赖:使用单例模式可能会隐藏类之间的依赖关系,使代码难以测试和维护。