实例构造函数单例模式

本篇文章朋友在北京游玩的时候突然想到的...这段时间就有想写几篇关于实例构造函数的笔记,所以回家到之后就奋笔疾书的写出来发表了

    class CSingleton { public: static CSingleton * GetInstance() { if (m_pInstance == NULL) { m_pInstance = new CSingleton; } return m_pInstance; } private: CSingleton(){}; /* 默认的构造函数设置为私有 */ static CSingleton *m_pInstance; };

    

该类有如下特色:

    

(1)它有一个指独一实例的静态指针m_pInstance,并且是私有的。

    

(2)它有一个私有的函数,可以获得这个独一的实例,并在须要的时候创建该实例。

    

(3)它的构造函数是私有的,这样就不能从别处创建该类的实例。

    


    下面我们对该类进行测试:

    #include <iostream> using namespace std; class CSingleton { public: static CSingleton * GetInstance(); int GetVar(); void SetVar(int other); private: CSingleton(); /* 默认的构造函数设置为私有 */ ~CSingleton(); static CSingleton *m_pInstance; int m_var; }; CSingleton::CSingleton() : m_var(20) { cout << "Singleton Constructor!" << endl; } CSingleton::~CSingleton() { cout << "Singleton Destructor!" << endl; } CSingleton* CSingleton::m_pInstance = NULL; /* 初始化为NULL */ CSingleton * CSingleton::GetInstance() { if (m_pInstance == NULL) { m_pInstance = new CSingleton; } return m_pInstance; } int CSingleton::GetVar() { return m_var; } void CSingleton::SetVar(int other) { m_var = other; } int main() { CSingleton *ton1 = CSingleton::GetInstance(); CSingleton *ton2 = CSingleton::GetInstance(); cout << "ton1 var = " << ton1->GetVar() << endl; cout << "ton2 var = " << ton1->GetVar() << endl; ton1->SetVar(150); cout << "ton1 var = " << ton1->GetVar() << endl; cout << "ton2 var = " << ton2->GetVar() << endl; return 0; }

    执行结果为:

    实例和构造函数

    我们知道,程序在结束的时候,系统会主动析构全部的全局变量。事实上,系统也会析构全部的类的静态成员变量,就像这些静态成员也是全局变量一样。利用这个特征,我们可以在C++单例模式类中定义一个这样的静态成员变量,而它的独一任务就是在析构函数中删除单例类的实例。如下面的代码中的CGarbo类(Garbo意为垃圾工人):

    #include <iostream> usng namespace std; class CSingleton { public: static CSingleton * GetInstance() { if (m_pInstance == NULL) { m_pInstance = new CSingleton(); } return m_pInstance; } private: CSingleton(){}; /* 默认的构造函数设置为私有 */ static CSingleton *m_pInstance; class CGarbo { public: CGarbo() { cout << "CGarbo Constructor!" << endl; } ~CGarbo() { if (CSingleton::m_pInstance != NULL) { delete m_pInstance; m_pInstance = NULL; cout << "CGarbo Destructor!" << endl; } } }; static CGarbo garbo; };

    每日一道理
灯,带有一种明亮的光,每当深夜来临,是它陪伴着你,如此默默无闻。它是平凡的,外表华丽与否,那都是一样的,珍珠点缀,水晶加饰的灯它只能用以装饰,来满足人们的虚荣心,比起这,普普通通的日光灯是幸运的,因为它照明的本性没有改变,如同生活中的一部分人平平凡凡却实实在在。

    

使用这类方法释放单例对象的方式有如下特征:

    

(1) 在单例外部定义专有的嵌套类

    

(2) 在单例内定义私有的专门用于释放单例对象的静态成员

    

(3)利用程序在结束时析构全局变量的特性,选择最终的释放机会

    

(4)使用C++单例模式的代码不须要任何操纵,不必关心对象的释放

    


    

下面是测试样例:
#include <iostream>
using namespace std;

class CSingleton
{
public:
	static CSingleton * GetInstance();
	int GetVar();
	void SetVar(int other);
private:
	CSingleton();			/* 默认的构造函数设置为私有 */
	~CSingleton();
	static CSingleton *m_pInstance;
	int m_var;
	class CGarbo
	{
	public:
		CGarbo()
		{
			cout << "CGarbo Constructor!" << endl;
		}
		~CGarbo()
		{
			if (CSingleton::m_pInstance != NULL)
			{
				delete m_pInstance;
				m_pInstance = NULL;
				cout << "CGarbo Destructor!" << endl;
			}
		}
	};
	static CGarbo garbo;
};

CSingleton::CGarbo CSingleton::garbo;

CSingleton::CSingleton() : m_var(20)
{
	cout << "Singleton Constructor!" << endl;
}

CSingleton::~CSingleton()
{
	cout << "Singleton Destructor!" << endl;
}

CSingleton* CSingleton::m_pInstance = NULL;
CSingleton * CSingleton::GetInstance()
{
	if (m_pInstance == NULL)
	{
		m_pInstance = new CSingleton;
	}
	return m_pInstance;
}

int CSingleton::GetVar()
{
	return m_var;
}

void CSingleton::SetVar(int other)
{
	m_var = other;
}

int main()
{
	CSingleton *ton1 = CSingleton::GetInstance();
	CSingleton *ton2 = CSingleton::GetInstance();
	cout << "ton1 var = " << ton1->GetVar() << endl;
	cout << "ton2 var = " << ton1->GetVar() << endl;
	ton1->SetVar(150);
	cout << "ton1 var = " << ton1->GetVar() << endl;
	cout << "ton2 var = " << ton2->GetVar() << endl;

	return 0;
}

执行结果为:
实例和构造函数

文章结束给大家分享下程序员的一些笑话语录: Bphone之你们聊,我先走了!移动说:我在phone前加o,我叫o缝;苹果说:我在phone前i,我是i缝;微软说:我在phone前加w,我叫w缝;三星说:你们聊,我先走了!
将来王建宙写回忆录的时候,一定要有一句“常小兵为中国移动的发展做出了不可磨灭的贡献”。

--------------------------------- 原创文章 By 实例和构造函数 ---------------------------------

posted @ 2013-05-23 21:42  坚固66  阅读(254)  评论(0编辑  收藏  举报