设计模式--单例

前几天有个面试,被问到设计模式中的单例模式,可惜自己很菜,没用过,结果被鄙视了。回来就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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值