欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

C++设计模式浅识单例模式

程序员文章站 2022-06-04 22:03:53
...
什么是单例模式?

保证一个类只有一个实例,并提供一个访问它的全局访问点。【DP】

让类的自身负责保存它的唯一实例,这个类保证没有其他实例可以被创建,并且此类可以提供一个访问该实例的方法。【DP】

什么时候需要单例模式?

程序只需要一个方法控制某项功能,不允许创建第二个此功能。比如:银行使用的取号机。

使用单例模式需要了解C++static关键字的用法我的这篇博文对static作了浅析

测试用例:
[code]int main(){
    //单例模式初始化两个实例的方法
    Singleton *s1 = Singleton::getInstance();
    Singleton *s2 = Singleton::getInstance();

    if(s1 == s2)
        std::cout << "Two the objects are the same instance.\n";
    else
        std::cout << "Two the objects are the different instance.\n";

    return 0;
}

单例模式实现:

[code]class Singleton{
private:
    //将构造函数声明为私有的,从而保证只允许类内使用
    Singleton(){}
    //声明一个类的静态对象(类外初始化)
    static Singleton *instance;
public:
    //静态成员方法,提供一个访问仅有实例的全局访问点。即提供接口创建对象
    static Singleton* getInstance(){
        if(instance != NULL){
            instance = new Singleton;
        }
        return instance;
    }
};
//类外部初始化静态成员变量(静态成员变量必须被初始化)
Singleton* Singleton::instance = NULL;

附:若为多线程编程情况下,需要加锁并做两次判断是否为空。

[code]class Singleton{
private:
    //将构造函数声明为私有的,从而保证只允许类内使用
    Singleton(){}
    //声明一个类的静态对象(类外初始化)
    static Singleton *instance;
public:
    //静态成员方法,提供一个访问仅有实例的全局访问点。即提供接口创建对象
    static Singleton* getInstance(){

        if(instance != NULL){

            lock(syncObj){
               if(instance != NULL){
                   instance = new Singleton;
               }//if
            }//lock
        }//if
        return instance;
    }
};
//类外部初始化静态成员变量(静态成员变量必须被初始化)
Singleton* Singleton::instance = NULL;

加lock是为了两个线程只有一个进入,另一个线程排队等候。第一个线程进入并出来后,后者才能进入。第二个判空是为了保证第一个线程创建了实例,第二个线程进入后就不再创建实例。

以上就是C++设计模式浅识单例模式的内容,更多相关内容请关注PHP中文网(www.php.cn)!