设计模式 ---- 单例模式
单例模式
在了解单例模式之前 需要先了解关键字static
有关static的修饰位置,需要重点关注的有4种
-
static 修饰全局变量
-
static 修饰局部变量
-
static 修饰成员变量
-
static 修饰成员函数
当static修饰全局变量时,表示这个变量只有变量所在.cpp文件中能够被访问到
当static修饰局部变量时,并不表示修改其归属性,只是表明,该变量被创建出来,会伴随整个程序的生命周期
当static修饰成员变量时,表示表示这个变量不再属于某一个具体的对象
例如
class Person
{
public:
static int count;
};
int Person::count = 0;
不需要为了修改类中的成员变量,而特地的去创建一个类的实例
当static修饰成员函数的时候,表示这个函数属于整个类,而不是属于某一个具体的对象(和修饰成员变狼类似)
这里需要注意,static 成员函数不能依赖普通成员函数,(因为static不依赖具体类,具体对象有具体的成员变量,如果static函数能访问普通成员变量,那么访问的是锯条哪一个具体对象的成员变量呢)
单例模式的作用
单例模式保证某个类在整个程序生命周期内只有一个实例,并提供一个统一的访问入口,让程序中的其他地方能够访问这个唯一实例
适合那些在整个程序运行期间只需要一个实例,或者从设计上就应该限制为一个实例的对
单例模式的核心思路是,将构造函数私有化,禁止外部随意创建对象;同时提供一个公共的访问入口,在第一次访问时创建唯一的对象,之后再次访问时,都返回第一次创建的那个对象
应用情况有限,比如:系统的log管理...
简单单例模式例子(这个例子好像并未完美优雅的解决根本问题,在多线程下,如果两个线程同时访问GetInstance,且单例并未初始化的情况下,本质相当于,创建单例的时候,进行了两次创建,相当于一个变量两次赋值)
class Singleton
{
private:
Singleton()
{
cout << "创建 Singleton" << endl;
}
public:
static Singleton& GetInstance(){
static Singleton instance;
return instance;
}
};
在使用时:
Singleton* singleIns = Singleton::GetInstance();
Singleton* singleIns1 = Singleton::GetInstance();
Singleton* singleIns2 = Singleton::GetInstance();
这里的singleIn、singleIns1、singleIns拿到的都是同一个实例
浙公网安备 33010602011771号