定义
保证一个类仅有一个实例,并提供一个能访问它实例的方法。
案例
在开发过程中,很多地方都会用到单例模式,比如一个打印机对象,一个缓存对象,一个资源管理器都会用到单例。
单例模式的实现也非常简单:
class SingleTon {public:static SingleTon* instance() {if (m_instance != NULL)m_instance = new SingleTon();return m_instance;}private:SingleTon() {}private:static SingleTon* m_instance;};
为了线程安全,可以在创建钱加一把锁避免重复创建:
class SingleTon {public:static SingleTon* instance() {pthread_mutex_lock(&m_mutex);if (m_instance != NULL)m_instance = new SingleTon();pthread_mutex_unlock(&m_mutex);return m_instance;}private:SingleTon() {}private:pthread_mutex_t m_mutex;static SingleTon* m_instance;};
还可以使用一种简单的方法:
class SingleTon {public:static SingleTon* instance() {static SingleTon singleTon;return &singleTon;}private:SingleTon() {}};
适用性
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问的时候。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
优缺点
- 单例模式防止其他对象实例化自己的副本,确保唯一性。
- 控制了实例化过程,可以灵活更改实例化过程。
- 每次调用都会检查是否创建了实例,可以通过静态初始化解决(如上)。
- 不能管理对象生命期,删除对象实例的时候,会导致单例类中出现悬浮引用。
本文介绍了单例模式的概念及其应用场景,提供了几种实现方式,包括简单的单例模式、线程安全的单例模式及静态成员实现的单例模式。讨论了单例模式的优点与缺点。

被折叠的 条评论
为什么被折叠?



