前几天有个面试,被问到设计模式中的单例模式,可惜自己很菜,没用过,结果被鄙视了。回来就google了一顿,现在对这个模式比较了解了,还是很简单的,哎,要是早看到就好了。。。
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
总结下别人的使用经验:
一个是一雨田的例子,稍改了下:
* 通常情况下,用户可以对应用系统进行配置,并将配置信息保存在配置文件中,应用系统在启动时首先将配置文件加载到内存中,
* 这些内存配置信息应该有且仅有一份。
* 单例模式保证Config类只能有一个实例。这样,Config类的使用者无法定义该类的多个实例,否则会产生编译错误。
class CConfig
{
public:
static CConfig* Instance(); // 此方法共外界使用,它是获得本类实例的唯一全局访问点
int GetData( ) const { return m_data; }
void SetData( int data )
{
m_data = data;
}
private:
static CConfig* pConfig; // 声明一个静态类变量
CConfig(); // 构造函数为private,这就堵死了外界利用new创建此类实例的可能
int m_data;
};
CConfig::CConfig() : m_data(0) { }
CConfig* CConfig::Instance()
{
if( pConfig == NULL ) // 这里实现唯一性,若实例不存在,new一个,否则就返回那个唯一的实例
{
pConfig = new CConfig();
}
return pConfig;
}
CConfig* CConfig::pConfig = NULL;
int _tmain(int argc, _TCHAR* argv[])
{
CConfig* pconfig = NULL;
pconfig = CConfig::Instance();
pconfig->SetData( 3 );
int tem = pconfig->GetData();
cout<<"配置数据为:"<<tem<<endl;
// 不再创建新的CConfig实例,只是返回那个唯一的
CConfig* pconfig2 = NULL;
pconfig2 = CConfig::Instance();
if( pconfig == pconfig2 )
cout<<"两个对象是相同的实例"<<endl;
delete pconfig;
// delete pconfig2; // 也可以在这里验证,去掉注释会运行期出错,因为delete的是同一个对象
system("pause");
return 0;
}
另一个例子是大话设计模式中的,原来是C#代码,改成C++:
有一个MDI窗体程序,其中有一个工具箱窗体,需要实现要么工具箱不出现,要么只出现一个。
class CToolBox
{
public:
static CToolBox* GetToolBox();
private:
CToolBox()
{
// InitComponent( ); // 完成工具箱的功能
}
static CToolBox* toolbox;
};
CToolBox* CToolBox::GetToolBox()
{
if( toolbox == NULL )
{
toolbox = new CToolBox();
// 其它的操作
}
return toolbox;
}
CToolBox* CToolBox::toolbox = NULL;
// 如果菜单项里和工具栏里都有这个工具箱,当用户点击这两个按钮,只会有唯一的一个工具箱
void OnClickMenuToolBox()
{
CBoxTool* pToolBox = CBoxTool::GetToolBox();
pToolBox->Show();
}
void OnClickToolStripToolBox()
{
CBoxTool* pToolBox = CBoxTool::GetToolBox();
pToolBox->Show();
}