单例即该类只能有一个实例。
应用:如在游戏开发中,可以使用单例模式来管理各种资源,确保这些资源在整个游戏中只被加载和管理一次。
实现
分类
class Singleton
{
private:
Singleton() {} //私有构造函数
~Singleton() {} //私有析构函数
Singleton(const Singleton&) = delete; //删除拷贝构造函数
Singleton& operator=(const Singleton&) = delete; //删除赋值运算符
Singleton(Singleton&&) = delete; //删除移动构造函数
Singleton & operator=(Singleton&&) = delete; //删除移动赋值运算符
private:
static Singleton instance; //静态成员变量,存储实例
public:
static Singleton* getInstance() //静态成员函数,获取实例
{
return &instance;
}
};
Singleton Singleton::instance; //静态成员变量实例化
int main()
{
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
return 0;
}

class Singleton
{
private:
Singleton(){} //私有构造函数
~Singleton(){} //私有析构函数
Singleton(const Singleton&) = delete; //删除拷贝构造函数
Singleton& operator=(const Singleton&) = delete; //删除赋值运算符
Singleton(Singleton&&) = delete; //删除移动构造函数
Singleton & operator=(Singleton&&) = delete; //删除移动赋值运算符
private:
static Singleton* instance; //静态成员变量,存储实例
public:
static Singleton* getInstance() //静态成员函数,获取实例
{
if (instance == nullptr)
instance = new Singleton();
return instance;
}
static void deleteInstance() //静态成员函数,释放实例
{
if (instance != nullptr)
{
delete instance;
instance = nullptr;
}
}
};
Singleton* Singleton::instance = nullptr; //静态成员变量定义和初始化
int main()
{
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
Singleton::deleteInstance();
return 0;
}


mutex m;
class Singleton
{
private:
Singleton() {} //私有构造函数
~Singleton() {} //私有析构函数
Singleton(const Singleton&) = delete; //删除拷贝构造函数
Singleton& operator=(const Singleton&) = delete; //删除赋值运算符
Singleton(Singleton&&) = delete; //删除移动构造函数
Singleton& operator=(Singleton&&) = delete; //删除移动赋值运算符
static Singleton* instance; //静态成员变量,存储实例
class Garbo //在析构函数中释放实例
{
public:
~Garbo()
{
if (Singleton::instance != nullptr)
{
delete instance;
instance = nullptr;
}
}
};
static Garbo garbo; //静态成员变量,在程序执行结束时,系统会调用它的析构函数
public:
static Singleton* getInstance() //静态成员函数,获取实例
{
if (instance == nullptr) //加锁前判断,这样如果实例存在,就不需加锁了
{
lock_guard<mutex>lock(m); //创建实例前加锁
if (instance == nullptr)
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr; //静态成员变量定义和初始化
int main()
{
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
return 0;
}
class Singleton
{
private:
Singleton() {} //私有构造函数
~Singleton() {} //私有析构函数
Singleton(const Singleton&) = delete; //删除拷贝构造函数
Singleton& operator=(const Singleton&) = delete; //删除赋值运算符
Singleton(Singleton&&) = delete; //删除移动构造函数
Singleton& operator=(Singleton&&) = delete; //删除移动赋值运算符
public:
static Singleton* getInstance() //静态成员函数,获取实例
{
static Singleton instance; //局部静态成员变量,存储实例
return &instance;
}
};
int main()
{
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
return 0;
}
