c++的单例模式

单例模式

什么是单例模式

只能创建出一个对象的结构、联合、类叫单例模式。

什么时候需要使用单例模式

1、Windows系统的任务管理器。

2、网络或服务器程序的访问计数器。

3、线程池、数据池,一个程序中只能创建一个线程池或数据池。

单例模式的实现原理

1、把构造函数、拷贝构造设置成私有的,不允许创建类对象。

2、在类中声明+定义一个静态的类对象(饿汉单例) 或类对象指针(懒汉单例)。

3、提供一个静态成员接口,用于获取静态的类对象。

饿汉单例模式

只要程序一运行,就把单例类的类对象创建出来,不管后续是否使用到。

缺点:如果后续程序使用不到单例对象,就造成了资源、时间上的浪费。

优点:线程安全,再多的线程也不可能创建出多个类对象。

懒汉单例

直到调用获取单例类对象的接口才会把对象创建出来。

缺点:如果在多线程情况下,多个线程同时调用对象的获取接口,可能会创建出多个类对象。

优点:如果用不到单例对象就不会真正创建,节约资源和时间。

单例模式的实现原理

1、把构造函数、拷贝构造设置成私有的,不允许创建类对象。

2、在类中声明+定义一个静态的类对象(饿汉单例) 或类对象指针(懒汉单例)。

3、提供一个静态成员接口,用于获取静态的类对象。

练习1:实现饿汉单例模式。

#include <iostream>
using namespace std;
​
class HungrySingle
{
    // 声明静态对象
    static HungrySingle obj;
​
    // 把构造和拷贝构造设置为private,可以防止创建类对象
    HungrySingle(void) 
    {
        cout << "创建了类对象" << endl;
    }
    HungrySingle(const HungrySingle& that) {}
public:
    // 只能调用该接口获取静态类对象
    static HungrySingle& getSingleObject(void)
    {
        return obj;
    }
    void show(void)
    {
        cout << this << endl;
    }
};
​
// 定义静态对象
HungrySingle HungrySingle::obj;
​
int main(int argc,const char* argv[])
{
    cout << "main run ..." << endl;
    HungrySingle& h1 = HungrySingle::getSingleObject();
    HungrySingle& h2 = HungrySingle::getSingleObject();
    HungrySingle& h3 = HungrySingle::getSingleObject();
    h1.show();
    h2.show();
    h3.show();
​
    return 0;
}

练习2:实现懒汉单例模式。

#include <iostream>
using namespace std;
​
class LazySingle
{
    static LazySingle* obj;
    LazySingle(void)
    {
        cout << "创建单例对象" << endl;
    }
    LazySingle(const LazySingle& that)
    {
    }
public:
    static LazySingle* getSingleObject(void)
    {
        if(NULL == obj)
        {
            obj = new LazySingle;
        }
        return obj;
    }
    void show(void)
    {
        cout << this << endl;
    }
};
LazySingle* LazySingle::obj;
​
int main(int argc,const char* argv[])
{
    cout << "main run ..." << endl;
    LazySingle* l1 = LazySingle::getSingleObject();
    LazySingle* l2 = LazySingle::getSingleObject();
    LazySingle* l3 = LazySingle::getSingleObject();
    l1->show();
    l2->show();
    l3->show();
    return 0;
}

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值