单例模式

单例模式也叫单件模式,在单例模式中,构造函数应该在private中,限制只能在类内创建对象。

1. 单例类保证全局只有一个唯一实例对象。

2. 单例类提供获取这个唯一实例的接口。

实现单例模式的思路:一个类能返回对象一个引用(永远是一个)和一个获得该实例的方法(必须是静态方法),构造函数为私有的,其它初的代码就无法通过类的构造函数来实例化类的对象,只能通过类提供的静态方法获得类的唯一实例。

下面是一个简单的单例类:

不考虑线程安全的一个单例类

class Singleton
{
public:
    // 获取唯一对象实例的接口函数
    static Singleton* GetInstance()
    {
        if (_sInstance ==NULL)
        {
            _sInstance = new Singleton();
        }
        return _sInstance;
    }
    // 删除实例对象
    staticvoid DelInstance()
    {
        if (_sInstance)
        {
            delete _sInstance;
            _sInstance =NULL;
        }
    }
    void Print()
    {
        cout<<_data<<endl;
    }
private:
    // 构造函数定义为私有,限制只能在类内创建对象
    Singleton()
        :_data(0)
        {}
    Singleton(const Singleton&);
    Singleton&operator=(const Singleton&);
    // 指向实例的指针定义为静态私有,这样定义静态成员函数获取对象实例
    static Singleton*_sInstance;
    // 单例类里面的数据
    int _data;
};
Singleton* Singleton::_sInstance =NULL;
void TestSingleton()
{
    Singleton::GetInstance()->Print();
    Singleton::DelInstance();
}

优点:1、在单例模式中,活动的单例只有一个实例,对单例类的所有实例化都得到相同的一个实例,防止其他对象对自己的实例化,确保所有对象都访问一个实例。

2、由于系统内存中只存放一个对象,因此可以节约系统资源,当需要频繁创建和销毁对象时,单例模式可以提供系统性能。

3、避免对共享资源的多重占用。

缺点:1、不适用与多变的对象,如果同一类型的对象总是在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。

2、由于单例模式没有抽象层,因此单例类的扩展有很大困难。

3、如果实例化的对象长时间不能被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

单例模式的使用场景:

1、资源共享的境况下,避免由于资源操作时导致的性能或损耗等。

2、控制资源的情况下,方便资源之间的互相通信。

应用场景举例:

打印机;Windows的TaskMangage(任务管理器);Windows的RecycleBin(回收站);网站的计数器;