您的位置:首页 > 编程语言 > C语言/C++

计划生育之单例模式学习笔记[C++版]

2009-12-12 16:12 501 查看
/************************************************************************
* 单例模式学习笔记[C++]
* Author:  陈相礼
* Time:    2009.12.10
* Compiler: VC8
************************************************************************/

#include "SingletonPattern.h"
#include "SingletonPattern1.h"

#include <iostream>
using namespace std;

CSingleton *CSingleton::mp_instance = 0;
CCouple *CCouple::mp_child = 0;

int main()
{
//------------------单例模式原理类测试-------------------
CSingleton *s1 = CSingleton::GetInstance();
CSingleton *s2 = CSingleton::GetInstance();

if ( s1 == s2 )
{
cout << "两个对象相同的实例!" << endl;
}

//------------------计划生育类测试一-------------------
CCouple *cp1 = CCouple::GetInstance();
cp1->vBorn();
CCouple *cp2 = CCouple::GetInstance();
if ( cp1 == cp2 )
{
cout << "两者指向同一对夫妇~~~" << endl;
}
return 0;
}

/************************************************************************
* 总结:
*	虽然说单例模式比较简单、应用比较广泛,但是在考虑的时候,细节还是很
* 多的。目前如果使用静态的成员变量指针,存在的问题是,何时去释放?如何
* 通知其它地方已经被释放?还有如何防止CSingleton类被其它类继承的问题?
* 这些都比较纠结?谁能给个解决方法,谢谢了~~~
************************************************************************/


#pragma once

/**********************************************
* 单例模式原理:
*	保证一个类仅有一个实例,并提供一个访问它的全
* 局访问点。
*	通常我们可以让一个全局变量使得一个对象被访问
* 就,但它不能防止你实例化多个对象。一个最好的办
* 法是让类自身负责保存它的唯一实例。这个类可以保
* 证没有其它实例可以被创建,并且它可以提供一个访
* 问该实例的方法。
***********************************************/

#include <iostream>
using namespace std;

//---------------------------------------------
// CSingleton类
//   定义一个GetInstance操作,允许客户访问它的唯
// 一实例。GetInstance 是静态方法,主要负责创建
// 自己的唯一实例
class CSingleton
{
public:
// 若实例不存在则创建一个实例,否则返回已有的实例
static CSingleton* GetInstance( void )
{
// 多线程时加锁,双重锁定
//if ( NULL == mp_instance )
//{
//	lock()
//	{
if ( NULL == mp_instance )
{
mp_instance = new CSingleton();
}
//	}
//}
return mp_instance;
}
protected:
private:
// 构造方法为私有,阻止外界利用new创建此类实例的可能
CSingleton(){};
// 声明为静态
static CSingleton *mp_instance;
class CGarbo // 它的唯一工作就是在析构函数中删除CSingleton的实例
{
public:
~CGarbo()
{
if (CSingleton::mp_instance)
{
delete CSingleton::mp_instance;
CSingleton::mp_instance = NULL;
cout << "删除" << endl;
}
}
};
// 定义一个静态成员,在程序结束时,系统会调用它的析构函数
static CGarbo Garbo;
};


#pragma once

/********************************
*
* 单例模式应用:计划生育
*
********************************/

#include <iostream>
using namespace std;

// 夫妇类
class CCouple
{
public:
void vBorn()
{
cout << "小孩呱呱坠地~~~" << endl;
}
// 生育审核
static CCouple * GetInstance()
{
if ( NULL == mp_child )
{
mp_child = new CCouple();
cout << "准生!" << endl;
}
else
{
cout << "⊙﹏⊙b汗,已经有一个孩子了,不能再生了!" << endl;
}
return mp_child;
}
protected:
private:
static CCouple *mp_child;
// 定义为私有,则由夫妇双方判断有没有必要计划生育
CCouple()
{
cout << "新婚夫妇~~~" << endl;
};
~CCouple()
{
if ( NULL != mp_child )
{
delete(mp_child);
mp_child = NULL;
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: