单例模式——C++实现

一、什么是单例模式模式?

单例模式是常用的基础设计模式,单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性。

单例模式分类

单例模式可以分为懒汉式和饿汉式,两者之间的区别在于创建实例的时间不同:
懒汉式:程序开始运行时单例并不存在,只有当需要使用该实例时,才会去创建并使用实例。(这种方式要考虑线程安全)
饿汉式:程序开始运行时就初始化创建实例,当需要时,直接调用即可。(本身就线程安全,没有多线程的问题)

单例类特点
  1. 构造函数和析构函数为private类型,目的禁止外部构造和析构
  2. 拷贝构造和赋值构造函数为private类型,目的是禁止外部拷贝和赋值,确保实例的唯一性
  3. 类里有个获取实例的静态函数,可以全局访问

二、懒汉模式(单线程,线程不安全)

简单的单例模式实现,可以在单线程下使用,多线程模式下会造成线程不安全。

#include <iostream>
using namespace std;

class Singleton
{
    public:
    //获取单例对象
    static Singleton * GetInstance();
    //释放单例对象
    static void DeleteInstance();

    private:
    //把构造函数、拷贝构造函数、赋值构造函数私有化,这样在类外就只能通过我们给出的接口函数获取实例了
    Singleton();
    ~Singleton();

    Singleton(const Singleton &);
    Singleton & operator=(const Singleton &);
    // 唯一单例对象指针
    static Singleton * p;
};
//类外初始化静态成员变量
Singleton * Singleton::p=nullptr;

Singleton::Singleton()
{

}
Singleton::~Singleton()
{

}

Singleton * Singleton::GetInstance()
{
    if(p==nullptr)
    {
        p=new Singleton();
    }
    return p;
}

void Singleton::DeleteInstance()
{
    if(p)
    {
        delete p;
        p=nullptr;
    }
}

三、懒汉模式(加锁,线程安全)

#include <iostream>
#include<pthread.h>
using namespace std;


class Singleton
{
    public:
    //获取单例对象
    static Singleton * GetInstance();
    //释放单例对象
    static void DeleteInstance();

    private:
    //把构造函数、拷贝构造函数、赋值构造函数私有化,这样在类外就只能通过我们给出的接口函数获取实例了
    Singleton();
    ~Singleton();

    Singleton(const Singleton &);
    Singleton & operator=(const Singleton &);
    // 唯一单例对象指针
    static Singleton * p;
    static pthread_mutex_t lock;

};
//类外初始化静态成员变量
Singleton * Singleton::p=nullptr;
pthread_mutex_t Singleton::lock=PTHREAD_MUTEX_INITIALIZER;

Singleton::Singleton()
{

}
Singleton::~Singleton()
{

}


Singleton * Singleton::GetInstance()
{
    //最外层的if(p==nullptr),目的是为了尽量避免加锁,毕竟加锁的开销有点大
    if(p==nullptr)
    {
        pthread_mutex_lock(&lock);
        if(p==nullptr)
        {
            p=new Singleton();
        }
        pthread_mutex_unlock(&lock);
    }
    return p;
}
void Singleton::DeleteInstance()
{
     pthread_mutex_lock(&lock);
     if(p)
     {
        delete p;
        p=nullptr;
     }
     pthread_mutex_unlock(&lock);
}

四、懒汉模式(线程安全,静态局部变量特性)

c++11特性,static修饰局部变量时,局部变量将会在全局数据区分配内存,直到程序运行结束才会释放内存,并且可以通过引用或指针在函数外部使用该局部变量。静态局部变量只初始化一次(实测是在第一次调用时初始化),之后每次调用函数时不再重新赋值,具有线程安全特性。在定义静态局部变量时不赋值的话,会执行默认初始化。

#include<iostream>
using namespace std;

class Singleton
{
    public:
    static Singleton & GetInstance();

    private:
    //把构造函数、拷贝构造函数、赋值构造函数私有化,这样在类外就只能通过我们给出的接口函数获取实例了
    Singleton();
    ~Singleton();

    Singleton(const Singleton &);
    Singleton & operator=(const Singleton &);

};


Singleton::Singleton()
{

}
Singleton::~Singleton()
{

}
Singleton & Singleton::GetInstance()
{
    // 局部静态特性的方式实现单实例
    static Singleton single;
    return single;
}

五、饿汉模式

#include <iostream>
using namespace std;

class Singleton
{
    public:
    //获取单例对象
    static Singleton * GetInstance();
    private:
    //把构造函数、拷贝构造函数、赋值构造函数私有化,这样在类外就只能通过我们给出的接口函数获取实例了
    Singleton();
    ~Singleton();

    Singleton(const Singleton &);
    Singleton & operator=(const Singleton &);
    // 唯一单例对象指针
    static Singleton * p;

};
//类外初始化静态成员变量
Singleton * Singleton::p=new Singleton();

Singleton::Singleton()
{

}
Singleton::~Singleton()
{

}

Singleton * Singleton::GetInstance()
{
    return p;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单例模式是一种创建对象的设计模式,它保证一个类只有一个实例,并提供一个全局访问点。 下面是一个简单的C++单例模式模板示例: ```cpp #include <iostream> template<typename T> class Singleton { public: // 获取单例实例 static T& getInstance() { static T instance; return instance; } // 防止拷贝构造和赋值操作 Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; private: // 构造函数私有化 Singleton() { std::cout << "Singleton instance created." << std::endl; } ~Singleton() { std::cout << "Singleton instance destroyed." << std::endl; } }; class MyClass { public: void print() { std::cout << "Hello, World!" << std::endl; } }; int main() { // 获取MyClass的单例实例 MyClass& instance = Singleton<MyClass>::getInstance(); // 使用单例实例 instance.print(); return 0; } ``` 在上述示例中,`Singleton`是一个通用的单例模板类,通过调用`getInstance`方法可以获取该类的单例实例。构造函数和析构函数私有化,防止外部直接创建和销毁对象。此外,为了防止拷贝构造和赋值操作,使用了`delete`关键字禁用了这两个函数。 `MyClass`是一个示例类,通过单例模式创建其单例对象,并调用对象的`print`方法。 运行该程序,可以看到输出结果为“Singleton instance created.”和“Hello, World!”。使用单例模式创建的对象只有一个实例,即使多次调用`getInstance`方法,返回的也是同一个实例。 总之,单例模式模板可以通过模板类和静态方法实现一个类的单例实例,避免了多次创建和销毁对象,同时提供了全局访问点,方便对象的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值