设计模式 单件模式

1-1、singleton.h

#ifndef SINGLETON_H
#define SINGLETON_H

#include <iostream>
using namespace std;

class Singleton
{
public:
    static Singleton* Instance(); //创建实例函数,作为public
    void Print();

protected:
    Singleton(); //构构函数,防止产生实例,作为protected
    Singleton(const Singleton&){}; //构构函数,防止拷贝构造另一个实例,作为protected
     ~Singleton();//析构函数,作为protected

private:
    static Singleton* mInstance; //类的唯一实例
    //TODO:这里可以添加互斥锁成员变量
};

#endif // SINGLETON_H

1-2、singleton.cpp

#include "singleton.h"

Singleton * Singleton::mInstance = NULL;

Singleton::Singleton()
{
    cout << "construct Singleton" << endl;
}

Singleton::~Singleton()
{
    if (mInstance)
    {
        delete mInstance;
        mInstance = NULL;
    }
}

Singleton * Singleton::Instance()
{
    //TODO:锁前和锁后检测,保证效率和多线程正确性
    if (!mInstance)
    {
        //TODO: 加锁
        if (!mInstance)
        {
            mInstance = new Singleton;
        }
    }
    return mInstance;
}

void Singleton::Print()
{
            cout << "this is a singleton instance" << endl;
}

2、main.cpp
/*
作者:jhluroom弹   QQ:454676244  MSN:jhlu0815@hotmail.com
开发IDE:qt creater
开发环境:QT C++
参考网站:神秘果:http://www.shenmiguo.com/

定义:
单件(Singleton)模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。

理解:
1.Singleton模式用来取代全局静态变量。C++通过静态成员变量来实现类实例全局唯一性。
2.instance()方法是单件提供的唯一调用入口。

要点:
1.为了防止外界调用产生多个实例,将构造方法、析构方法、拷贝构造方法、赋值重载方法都作为protected。
2.instance()方法产生对象方式有两种:使用局部static对象,生命期在首次进入局部生命期产生,在程序结束时销毁;
  通过new产生新对象,在析构方法中delete对象。
3.获取单件实例调用方式:Singleton::instance()获取对象指针。
4.解决多线程资源竞争条件。使用著名的“双检测锁定”办法来解决,即在锁定前和锁定后都检测对象是否产生,
  这样既能保证加锁效率又能保证单件实例的唯一性。

源码中通过Singleton加以实现。

以上文字说明,从网上整理而来,有可能部分与其他同仁相同,请谅解,希望我们能够共同交流,谢谢!
*/
#include <QtCore/QCoreApplication>

#include "singleton.h"

int main(int argc, char *argv[])
{
    cout << "=== jhluroom start ========" << endl;

    Singleton *mySingleton = Singleton::Instance();
    mySingleton->Print();

    cout << "=== jhluroom finish _^_ ===" << endl;
    return 0;
}

运行结果:
=== jhluroom start ========
construct Singleton
this is a singleton instance

=== jhluroom finish _^_ ===


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值