设计模式 ---- 单例模式

单例模式

在了解单例模式之前 需要先了解关键字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拿到的都是同一个实例

posted on 2026-09-04 17:33  咸云闲鱼  阅读(3)  评论(0)    收藏  举报