单例模式

本文详细阐述了单例模式的概念、应用场景,并通过多种示例代码展示了单例模式的实现方式,包括饿汉式、懒汉式、静态对象引用返回式、静态对象指针返回式以及线程安全式的单例类实现。文章还讨论了单例模式的优化及其实现细节,旨在为开发者提供全面的理解和应用指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1】什么是单例模式?

  单例,即所谓单个实例。单例模式即一个类只有一个实例的一种设计模式。

  单例模式保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

  显然单例模式的要点有三个:

  一是某个类只能有一个实例;

  二是它必须自行创建这个实例;

  三是它必须自行向整个系统提供这个实例。
  单例模式的常见应用场景2】单例模式的代码示例:

示例代码:

 

#include <iostream>
#include <string>
using namespace std;

class Singleton
{    
private:
    int i;
    static Singleton *instance;
    Singleton(int i)
    {
        this->i = i;
    }
public:
    static Singleton *getInstance()
    {
        return instance;
    }
    void show()
    { 
        cout << i << endl;
    }
};

Singleton* Singleton::instance = new Singleton(8899); 

class A : public Singleton
{

};

int main()
{
    Singleton *s = Singleton::getInstance();
    Singleton *s2 = A::getInstance();
    cout << s << endl;
    cout << s2 << endl;
    cout << (s == s2) << endl;
    return 0;
}

 

3】单例模式的进化史

(1)代码1:

说明:饿汉式

class CSingleton
{
private:
    CSingleton()   //构造函数是私有的
    {
    }
    static CSingleton *m_pInstance;

public:
    static CSingleton *GetInstance()
    {
        return m_pInstance;
    }
};

CSingleton *CSingleton::m_pInstance = new CSingleton();

 

2)代码2:

说明:懒汉式

class CSingleton
{
private:
    CSingleton()   //构造函数是私有的
    {
    }
    static CSingleton *m_pInstance;

public:
    static CSingleton *GetInstance()
    {
        if (NULL == m_pInstance)  //判断是否第一次调用
        {
            m_pInstance = new CSingleton();
        }
        return m_pInstance;
    }
};

CSingleton *CSingleton::m_pInstance = NULL;

 

3)代码3:

说明:静态对象引用返回式
class CSingleton
{
private:
    CSingleton()   //构造函数是私有的
    {
    }

public:
    static CSingleton & GetInstance()
    {
        static CSingleton instance;   //局部静态对象
        return instance;
    }
};
4)代码4:

说明:静态对象指针返回式
class CSingleton
{
private:
    CSingleton()   //构造函数是私有的
    {
    }
public:
    static CSingleton * GetInstance()
    {
        static CSingleton instance;   //局部静态对象
        return &instance;
    }
};
5)代码5:

说明:静态对象引用返回式优化(禁止拷贝构造和赋值)
class CSingleton
{
private:
    CSingleton()   //构造函数是私有的
    {
    }
    CSingleton(const CSingleton &);
    CSingleton & operator = (const CSingleton &);
public:
    static CSingleton & GetInstance()
    {
        static CSingleton instance;   //局部静态对象
        return instance;
    }
};
6)代码6:

说明:线程安全式单例类
struct CCriticalSection
{
    void Lock()
    {}
    void UnLock()
    {}
};

class Lock
{
private:       
    CCriticalSection m_cs;
public:
    Lock(CCriticalSection  cs) : m_cs(cs)
    {
        m_cs.Lock();
    }
    ~Lock()
    {
        m_cs.UnLock();
    }
};

class Singleton
{
private:
    Singleton();
    Singleton(const Singleton &);
    Singleton& operator = (const Singleton &);

public:
    static Singleton *Instantialize();
    static Singleton *pInstance;
    static CCriticalSection cs;
};

Singleton* Singleton::pInstance = NULL;

Singleton* Singleton::Instantialize()
{
    if (pInstance == NULL)
    {   //double check
        Lock lock(cs);           //用lock实现线程安全,用资源管理类,实现异常安全
        //使用资源管理类,在抛出异常的时候,资源管理类对象会被析构,析构总是发生的无论是因为异常抛出还是语句块结束。
        if (pInstance == NULL)
        {
            pInstance = new Singleton();
        }
    }
    return pInstance;
}

http://www.cnblogs.com/Braveliu/p/3950159.html

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值