温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

设计一个类,我们只能生成该类的一个实例。

发布时间:2020-07-30 02:29:40 来源:网络 阅读:959 作者:秋笙夏笛 栏目:编程语言
 单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

(1)这种方法只适用单线程。

#include<iostream>
#include<stdlib.h>
using namespace std;
class Csingleton
{
private:
    Csingleton()//构造函数私有化
    { 
        cout<<"Csingleton()"<<endl;
    }
	static Csingleton* m_pInstance;
public:
    static Csingleton* GetInstance()
    {
      //判断是否是第一次调用
       
      if(m_pInstance==NULL)
        {
            m_pInstance= new Csingleton();
        }
      return m_pInstance;
    }
};
Csingleton* Csingleton::m_pInstance=NULL;
void test()
{
    Csingleton* c=Csingleton::GetInstance();
    Csingleton* s=Csingleton::GetInstance();
 
}
int main()
{
    test();
    system("pause");
    return 0;
}

(2)多线程,当Csingleton还没有创建出来时,需要加把锁;当Csingleton创建出来之后,无需加锁。

#include<iostream>
#include<stdlib.h>
using namespace std;
class Csingleton
{
private:
    Csingleton()//构造函数私有化
    { 
        cout<<"Csingleton()"<<endl;
    }
	static Csingleton* m_pInstance;
public:
    static Csingleton* GetInstance()
    {
      //判断是否是第一次调用
       
      if(m_pInstance==NULL)
        {
			/*lock(syncObj);*/
            m_pInstance= new Csingleton();
        }
      return m_pInstance;
    }
};
Csingleton* Csingleton::m_pInstance=NULL;
void test()
{
    Csingleton* c=Csingleton::GetInstance();
    Csingleton* s=Csingleton::GetInstance();
 
}
int main()
{
    test();
    system("pause");
    return 0;
}

(3)利用静态构造函数,初始化静态变量的时候创建实例。

#include<iostream>
#include<stdlib.h>
using namespace std;
class Csingleton
{
private:
    Csingleton()//构造函数私有化
    { 
        cout<<"Csingleton()"<<endl;
    }
private:
	static Csingleton* m_pInstance=new Csingleton();
public:
    static Csingleton* GetInstance()
    {
      return m_pInstance;
    }
};
void test()
{
    Csingleton* c=Csingleton::GetInstance();
    Csingleton* s=Csingleton::GetInstance();
 
}
int main()
{
    test();
    system("pause");
    return 0;
}

结果:

设计一个类,我们只能生成该类的一个实例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI