-
- [2.12 单例模式](#2.12 单例模式)
-
- [2.12.1 饿汉式](#2.12.1 饿汉式)
- [2.12.2 懒汉式](#2.12.2 懒汉式)
2.12 单例模式
单例模式(Singleton Pattern,也称为单件模式),使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
面向对象编程中,每个对象都应该抽象代表一个设备,并通过对象完成对某个具体设备的管理和维护。
对于有些类只能有一个实例很重要,例如打印机管理器、设备管理器、任务管理器等。
实现单例模式的三个主要步骤:
-
私有化构造函数
cppclass Singleton{ private: Singleton(void){...} Singleton(const Singleton &that){} };
-
使用静态成员变量维护唯一的单例对象
cppclass Singleton{ private: Singleton(void){...} Singleton(const Singleton &that){} ... static Singleton s_instace; }; Singleton Singleton::s_instace;
-
定义静态成员函数用于获取单例对象
cppclass Singleton{ private: Singleton(void){...} Singleton(const Singleton &that){} ... static Singleton s_instace; public: static Singleton& getInstance(void){ return s_instance; } }; Singleton Singleton:s_instace;
2.12.1 饿汉式
加载进程时即完成创建(饿),用不用都创建。
cpp
#include <iostream>
using namespace std;
class Signleton{
private:
int m_a;
Signleton(int data = 0){
m_a = data;
}
Signleton(const Signleton& that){}
static Signleton m_instance;
public:
static Signleton& getInstance(void) {
return m_instance;
}
void print() {
cout << m_a << endl;
}
};
//返回类型 类 :: 静态成员变量
Signleton Signleton::m_instance = 100;
int main(void) {
Signleton& s1 = Signleton::getInstance();
Signleton& s2 = Signleton::getInstance();
s2.print();
s1.print();
cout << &s1 << endl;
cout << &s2 << endl;
//Signleton s4 = 199;//error 不支持创建对象
return 0;
}
2.12.2 懒汉式
用时再创建(懒),不用再销毁
cpp
#include <iostream>
using namespace std;
class Signleton{
private:
int m_a;
static int m_count; //记录对象的引用次数
static Signleton *m_instance;
Signleton(int data = 0){
m_a = data;
}
Signleton(const Signleton& that){}
public:
static Signleton& getInstance(void){
if(m_instance == NULL){
m_instance = new Signleton(123);
}
m_count++;
return *m_instance;
}
void release() {
m_count--;
if(m_count == 0){ //条件成立 说明没有人引用该类了
delete m_instance;
m_instance = NULL;
}
}
~Signleton(){
cout << "distroy" << endl;
}
};
Signleton* Signleton::m_instance = NULL;
int Signleton::m_count = 0;
int main(void) {
//Signleton s1; //error
Signleton& s1 = Signleton::getInstance();
Signleton& s2 = Signleton::getInstance();
cout << &s1 << " " << &s2 << endl;
s1.release();
s2.release();
return 0;
}