设计模式-单例模式

本文探讨了单例模式中的饿汉模式,建议使用全局区的普通对象而非堆上的指针对象,因为这样可以避免不必要的堆内存分配,并在程序结束时自动调用析构函数。同时,通过私有化构造函数、拷贝构造函数和赋值构造函数来确保单例的唯一性。对于指针对象,可以通过内嵌类的方式在程序结束时自动调用析构函数。
摘要由CSDN通过智能技术生成

单例模式分懒汉模式和饿汉模式。本文对饿汉子模式中的一些细节进行简要说明。
1、单例类的实例化可以采用堆也可以采用全局区,分别对应指针对象和普通对象。指针对象的地址需要使用static 修饰,所以也是保存在全局区,指针对象是通过new出来的,所以对应类的大小内存是在堆上开辟的。那是使用指针对象还是普通对象呢?
我建议使用普通对象,有两个原因。一是单例类的实例化,一般不释放,而堆却是动态的意思,所以没必要将一般不释放的内存在动态的堆上开辟。二是程序结束时,系统会释放所有的全局变量,包括这里的static普通对象,这样就可以自动调用析构函数处理其它需要关闭文件之类的操作,可以参考后文。
static成员均需要类内声明,类外cpp文件初始化。两者写法如下。

.h文件如下:

class CReject{
   
public:
    static CReject* GetInstance()
    {
   
        return spInst;return &Inst;
    }
private:
    static CReject* spInst;
    static CReject Inst;
    //static EchReject* spInst = new EchReject;//这是错误的
};

.cpp文件如下

CReject* CReject::spInst = new CReject();//或者new CReject;
CReject CReject::Inst;

new CReject() 和new CReject 没有区别。对于系统内置的类型,比如new int和new int()有区别,带括号具有初始化的作用。

2、保证单例
如何保证单例?先看看不保证单例的设计:

class CReject{
   
public:
    static CReject* GetInstance()
    {
   
        return spInst;
    }
    void PrintValue(){
   qDebug()<<"PrintValue"<<mValue;}
    void SetValue(int v){
   mValue=v;}
public:
    CReject(const CReject&e)    //拷贝构造函数
    {
   
        qDebug()<<"重写拷贝构造函数";
        mValue = e.mValue;
    }
    CReject& operator=(const CReject&e) //赋值函数
    {
   
        qDebug()<<"重写赋值函数";
        return *this;
    }
public:
    CReject(){
   qDebug()<<"普通构造函数";}
    ~CReject(){
   qDebug()<<"析构函数"<<mValue;}
private:
    static CReject* spInst;
    int mValue;
};
CReject* CReject::spInst = new CReject
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值