网站是怎么建设的,游戏网址,做网站配置好了找不到服务器,织梦网站管理后台系统上面的织梦链接怎么样去掉单例模式
单例模式(Singleton Pattern#xff0c;也称为单件模式)#xff0c;使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例#xff0c;并提供一个访问它的全局访问点#xff0c;该实例被所有程序模块共享。
定义单例类
● 私有化它的构造函数#xff0c;…单例模式
单例模式(Singleton Pattern也称为单件模式)使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例并提供一个访问它的全局访问点该实例被所有程序模块共享。
定义单例类
● 私有化它的构造函数以防止外界创建单例类的对象
● 使用类的私有静态指针变量指向类的唯一实例
● 使用一个公有的静态方法获取该实例。
懒汉版
单例实例在第一次被使用时才进行初始化这叫做延迟初始化。
class Singleton
{
private:static Singleton* instance;
private:Singleton() {};Singleton(const Singleton);
public:static Singleton* getInstance(){if (instance NULL)instance new Singleton();return instance;}
};
Singleton* Singleton::instance NULL;
饿汉模式
class Singleton {
public:static Singleton * getInstance() {return instance_;}
private:Singleton();Singleton(const Singleton);static Singleton* instance_;
};
Singleton* Singleton::instance_ new Singleton(); 懒汉式单例模式是一种延迟加载的单例模式在需要时才创建实例。在多线程环境下需要保证线程安全避免多个线程同时创建实例。以下是一个线程安全的懒汉式单例模式的C实现
#include mutexclass Singleton {
private:static Singleton* instance;static std::mutex mtx;// 私有构造函数防止外部创建实例Singleton() {}public:// 获取单例实例的静态方法static Singleton* getInstance() {// 使用双重检查锁定Double-Checked Locking保证线程安全且避免不必要的锁开销if (instance nullptr) {std::lock_guardstd::mutex lock(mtx); // 加锁保护if (instance nullptr) {instance new Singleton();}}return instance;}// 禁止拷贝构造函数和赋值操作符Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;
};// 在类外初始化静态成员变量
Singleton* Singleton::instance nullptr;
std::mutex Singleton::mtx;在上述代码中我们使用了std::mutex来保护实例的创建过程确保在多线程环境下只有一个线程能够创建实例。std::lock_guard用于自动管理锁的加锁和解锁确保在函数返回时会自动解锁。
需要注意的是由于需要保证单例对象唯一性我们还禁止了拷贝构造函数和赋值操作符以防止通过拷贝或赋值操作创建多个实例。
这样实现的懒汉式单例模式是线程安全的但在某些情况下双重检查锁定可能会导致一些性能问题。在现代C中还可以使用C11引入的局部静态变量来实现线程安全的懒汉式单例模式可以进一步简化代码并避免潜在的性能问题。 当使用C局部静态变量实现懒汉式单例模式时我们在getInstance()方法中使用了局部静态变量。局部静态变量是在第一次执行该代码行时初始化并且在程序的整个生命周期内保持其值直到程序结束。这样的特性使得局部静态变量非常适合实现懒汉式单例模式因为它们能够确保只有在第一次调用getInstance()方法时才会创建实例以后的调用都会返回同一个实例。
以下是使用局部静态变量实现懒汉式单例模式的代码
class Singleton {
private:// 私有构造函数防止外部创建实例Singleton() {}public:// 获取单例实例的静态方法static Singleton* getInstance() {static Singleton instance; // 局部静态变量在第一次调用时初始化且只初始化一次return instance;}// 禁止拷贝构造函数和赋值操作符Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;
};为什么这样写
这种实现方式是线程安全的原因如下 C11规定局部静态变量在多线程环境下的初始化是线程安全的。编译器会保证在多线程环境下局部静态变量的初始化只会发生一次避免了多线程并发调用时重复创建实例的问题。 在调用getInstance()方法时局部静态变量instance会被初始化并在整个程序生命周期内保持其值。这保证了只有在第一次调用getInstance()方法时才会创建实例并返回以后的调用都将返回同一个实例。
需要注意的是使用局部静态变量实现懒汉式单例模式不会涉及锁的使用因此在性能上通常比双重检查锁定方式更高效。这是一种简洁且安全的单例模式实现方式。