实战经验:一种按需创建的单件模式

实战经验:一种按需创建的单件模式

作者: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函数已退出,所以我们看不到析构的打印字符串。

标签:

评论已关闭。