0
点赞
收藏
分享

微信扫一扫

单 例(Singleton)


单例模式:确保一个类只有一个实例,并提供一个全局访问点。这些类比如包括:线程池,缓存,对话框,处理偏好设置,注册表的对象,日志对象,充当打印机,显卡等设备的驱动程序对象。

要点:
1.单例模式确保程序中一个类最多只有一个实例
2.单例模式也提供访问这个实例的全局点
3.确定在性能和资源上的限制,然后小心地选择适当的方案来实现单件,以解决多线程问题
4.如果使用多个类加载器,可能导致单例失效而产生多个实例

如果性能对应用程序不是很关键:

#include<iostream>
#include<stdlib.h>
using namespace std;

class Singleton{
private:
    Singleton(){}
public:
    static Singleton* singleton;
    static Singleton* getInstance(){
        if(singleton==NULL){
           singleton = new Singleton;//程序将会走这一行
        }
        return singleton;
    }
    void fun(){
        cout << "this is a singleton" << endl;
    }
};
//注意静态变量得在外面初始化
Singleton* Singleton::singleton = NULL;

int main(){
    Singleton::getInstance()->fun();
}



如果使用总是很急切,就不用延迟实例化


#include<iostream>
#include<stdlib.h>
using namespace std;

class Singleton{
private:
    Singleton(){}
public:
    static Singleton* singleton;
    static Singleton* getInstance(){
        return singleton;
    }
    void fun(){
        cout << "this is a singleton" << endl;
    }
};

//直接实例化,不延迟
Singleton* Singleton::singleton = new Singleton;

int main(){
    Singleton::getInstance()->fun();
}



多线程


#include<iostream>
#include<auto_ptr.h>
using namespace std;

class Singleton{
private:
    Singleton(){}
public:
    static Singleton* getInstance(){
        typedef auto_ptr<Singleton> singletonPtr;
        static singletonPtr singleton;
        if(singleton.get()==NULL){
            singleton.reset(new Singleton);
        }
        return singleton.get();
    }
    void fun(){
        cout << "this is a singleton" << endl;
    }
};

int main()
{
    Singleton::getInstance()->fun();
}

举报

相关推荐

0 条评论