实战经验:一种按需创建的单件模式
作者:BlogUpdater |
时间:2017-05-10 |
浏览:1816 |
评论已关闭 条评论
在MFC框架程序中,有一个theApp的唯一全局CWinApp对象,该对象在进入程序入口点之前就开始构造,在程序退出时才离开作用域进行析构。
今天我们探究一种按需创建的单件模式,该模式的特点在于:仅在需要时才创建单件对象。以下先给出演示代码:
先定义一个CTestManager类,该类中定义了一个静态的工厂方法 GetInstance,然后为了使用上的方便,还定义了一个宏theTestMgr。最后定义了对外接口方法Hello。
声明文件TestManager.h:
#pragma once class CTestManager { public: CTestManager(void); ~CTestManager(void); public: static CTestManager & GetInstance(); void Hello(const char * name); }; #define theTestMgr (CTestManager::GetInstance())
实现文件TestManager.cpp:
#include "StdAfx.h" #include "TestManager.h" CTestManager::CTestManager(void) { printf("CTestManager constructor\n"); } CTestManager::~CTestManager(void) { printf("CTestManager destructor\n"); } CTestManager & CTestManager::GetInstance() { static CTestManager theMgr; return theMgr; } void CTestManager::Hello(const char * name) { printf("Hello, %s\n", name); }
单件类定义完毕,其中值得注意的是,我们在GetInstance中定义了一个静态CTestManger实例并返回该实例的引用。
下面是使用该单件类的客户代码:
Main.cpp:
#include "stdafx.h" #include "TestManager.h" void func() { theTestMgr.Hello("func"); } int main() { printf("Before 1st func\n"); func(); printf("After 1st func\n"); printf("Before 2st func\n"); func(); printf("After 2st func\n"); theTestMgr.Hello("main"); getchar(); return 0; }
客户程序输出如下:
Before 1st func CTestManager constructor Hello, func After 1st func Before 2st func Hello, func After 2st func Hello, main
下面是对客户代码的解析:
1) 单件对象仅在第一次func调用中实例化,在第二次func调用时,由于该单件对象是静态对象,不需要再创建,所有这里我们只会看到一次单件对象的构造过程。
2) 不管在func和在main中,我们都可以直接使用宏theTestMgr来取得单件对象的唯一引用,这种使用方法,就像MFC的theApp一样方便。
3) 为什么在程序输出中没有看到单件对象的析构?这是因为单件对象为静态对象,只有当整个程序退出时才会离开作用域,这个时候,main函数已退出,所以我们看不到析构的打印字符串。
如需转载,请注明来自:Topomel Box
相关推荐
- 小技巧GET: 如何验证系统文件的数字签名
- Posted on 04月11日
- Visual Studio 新功能:Include 语句清理
- Posted on 07月13日
- 小技巧:Windows Update设定从Windows官网更新
- Posted on 03月20日
- 如果文件夹名称和程序重复了,系统如何处理
- Posted on 12月26日
评论已关闭。