设计模式----单例模式(c++实现)

来源:互联网 发布:ubuntu进入单用户模式 编辑:程序博客网 时间:2024/06/08 14:08
/**************************************************
单例的思想:
就是在一个类的内部将构造函数私有化,这样就不能随意调用了虽然类不能调用了,
封装的很好,但是类内部静态成员函数破坏了这种特性,我们可以使用静态成员函数
的全局特性,在函数外部调用类类的静态成员函数,然后在静态成员函数内部创建一个
此类的对象,然后将指向此对象的指针返回。
俄汉和懒汉的区别就是,在类中的定义的指向此类的指针是什么时候初始化的;
饿汉式:不管你需不需要,将此类的对象创建出来,然后赋值给静态成员变量(执行此对象的指针)
懒汉式:首先去判断你之前创建了没有,如果没创建,那么我就创建一个对象出来,不然的话我就
直接返回指向此对象的指针
*************************************************/
#include <iostream>
using namespace std;
class  Singelton//懒汉式
{
private:
Singelton(){
m_singer = NULL;
m_count = 0;
cout << "构造函数单例" << endl;
}
public:
static Singelton *getInstance()
{
if (m_singer == NULL)//懒汉式:1 每次获取实例都要判断
{ //之所以懒是因为每次用的时候才去判断是否创建
m_singer = new Singelton;
}
return m_singer;
}
static void printT()
{
cout << "m_count: " << m_count << endl;
}
private://私有成员变量,最高强度的封装。
static Singelton *m_singer;
static int m_count;
};
Singelton *Singelton::m_singer = NULL;  //懒汉式 并没有创建单例对象
int Singelton::m_count = 0;//静态成员变量,在类内部声明,在类外进行初始化
void main()
{
cout << "演示 懒汉式" << endl;
Singelton *p1 = Singelton::getInstance(); //只有在使用的时候,才去创建对象。
Singelton *p2 = Singelton::getInstance();
if (p1 != p2)
{
cout << "不是同一个对象" << endl;
}
else
{
cout << "是同一个对象" << endl;
}
p1->printT();
p2->printT();
system("pause");
}
/*********************************************************************/
class  Singelton2//俄汉式
{
private:
Singelton2()
{
m_singer = NULL;
m_count = 0;
cout << "构造函数Singelton ... do" << endl;
}
public:
static Singelton2 *getInstance()
{
return m_singer;
}
static void Singelton2::FreeInstance()
{
if (m_singer != NULL)
{
delete m_singer;
m_singer = NULL;
m_count = 0;
}
}
static void printT()
{
cout << "m_count: " << m_count << endl;
}
private:
static Singelton2 *m_singer;
static int m_count;
};
Singelton2 *Singelton2::m_singer = new Singelton2; //不管你要不要,我先把对象给创建出来
int Singelton2::m_count = 0;
void main()
{
cout << "演示 饿汉式" << endl;


Singelton2 *p1 = Singelton2::getInstance(); //只有在使用的时候,才去创建对象。
Singelton2 *p2 = Singelton2::getInstance();
if (p1 != p2)
{ cout << "不是同一个对象" << endl;}
else
{ cout << "是同一个对象" << endl;}
p1->printT();
p2->printT();
Singelton2::FreeInstance();
Singelton2::FreeInstance();
system("pause");

}

思路来源:传智博客--王保明

0 0
原创粉丝点击