介绍MFC框架中涉及到的设计模式(二)
接着上一篇《介绍MFC框架中涉及到的设计模式(一)》介绍
单例模式(Singleton Pattern)
单例模式是一种经常使用的软件设计模式。在它的核心结构中仅仅包括一个被称为单例类的特殊类。通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问。从而方便对实例个数的控制并节约系统资源。
假设希望在系统中某个类的对象仅仅能存在一个,单例模式是最好的解决方式。
单例模式的要点有三个: 1.某个类仅仅能有一个实例;
2.它必须自行创建这个实例;
3.它必须自行向整个系统提供这个实例。
单例模式典型的结构图例如以下所看到的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQkJPT1Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
由上图我们能够了解到,我们通过维护一个static成员变量来记录这个唯一的对象实例。通过一个Instance()接口来获得这个唯一的实例。
以下是一个用C++语言实现的Singleton模式的小样例帮助大家理解单例模式。注意(VC6.0能够执行)
代码片断1:Singleton.h
//Singleton.h
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton* Instance(); //获取唯一实例对象的接口
protected:
Singleton(); //防止被外界调用实例化。也能够声明成private
private:
static Singleton* _instance; //保存唯一的实例对象
};
#endif //~_SINGLETON_H_
代码片断2:Singleton.cpp
//Singleton.cpp
#include "Singleton.h"
#include <iostream>
using namespace std;
Singleton* Singleton::_instance = 0;
Singleton::Singleton()
{
cout<<"Singleton...."<<endl;
}
Singleton* Singleton::Instance()
{
if (_instance == 0)
{
_instance = new Singleton();
}
return _instance;
}
代码片断3:main.cp
//main.cpp
#include "Singleton.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
Singleton* sgn = Singleton::Instance();
return 0;
}
我们来看一下MFC中有关的单例模式。
每个MFC应用实例都派生于类CWinApp。每个应用程序都仅仅应该有一个派生于CwinApp的实例。CwinApp在设计上保证了一个应用程序不能生成多个实例,而且提供了一系列的函数用于对该唯一对象的一些属性的訪问,包含AfxGetApp。AfxGetInstanceHandle,AfxGetResourceHandle,AfxGetAppName等作为获取唯一实例对象的接口。
MFC是通过ASSERT来防止多次构造CWinApp对象的。在第二次构造CwinApp对象时。ASSERT内的表达式为假,将会弹出错误提示。
介绍MFC框架中涉及到的设计模式(二)的更多相关文章
- 在MFC框架中使用OpenGL的简单实例
引言 我们知道,在MFC框架中,用于绘图的接口是GDI.但GDI只能绘制简单的2D图形,要想制作精美的3D图形,一个可行的办法是使用OpenGL或者Direct3D等第三方库. 由于最近在给导师的一个 ...
- MFC框架中消失的WinMain()
学过一段时间的MFC之后,很多人大概都有一个疑问:在MFC中,WinMain()哪去了?因为任何一个使用过Win32 SDK编程的人都知道,WinMain()函数是Win32程序开始的入口点,可是在M ...
- 知乎上有一个问题“在mfc框架中,有上面方法能直接将opencv2.0库中的Mat格式图片传递到Picture Control”中显示?
一直以来,我使用的方法都是shiqiyu在opencvchina上面提供的引入directshow,并且采用cvvimage和cameraDs的方法.这个方法虽然在xp/win7/win8下面都能够成 ...
- Spring框架中的aop操作之二 通过配置文件实现增强
aop表达式写法 配置文件代码: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q ...
- 自动化测试框架中关于selenium api的二次封装
不多说,直接看代码如下: #coding:utf-8 from selenium import webdriver from selenium.webdriver.common.action_chai ...
- ENode 1.0 - 事件驱动架构(EDA)思想的在框架中如何体现
开源地址:https://github.com/tangxuehua/enode 上一篇文章,我给大家分享了我的一个基于DDD以及EDA架构的框架enode,但是只是介绍了一个大概.接下来我准备用很多 ...
- MFC框架
第一点:类别型录网的搭建: 类别型录网搭建的目的是为了实现所谓的"执行期类型识别",也就是在程序运行的时候识别出某个对象是否是某个类的实例(基类也可以).这里还不是很明白为什么需要 ...
- enode框架step by step之事件驱动架构(EDA)思想的在框架中如何体现
enode框架step by step之事件驱动架构(EDA)思想的在框架中如何体现 上一篇文章,我给大家分享了我的一个基于DDD以及EDA架构的框架enode,但是只是介绍了一个大概.接下来我准备用 ...
- MFC学习-第2,3课 MFC框架的运行机制
转自:http://blog.163.com/zhigang0633@126/blog/static/38790491200822711526168/ 讲述MFC AppWizard的原理与MFC程序 ...
随机推荐
- 转:sock_ev——linux平台socket事件框架(event dispatcher) .
最近比较忙,好久没更新了:今天我们看一下事件的监听方式,在linux下面事件的监听方式有三种select.poll.epoll,性能上面epoll最高,如果仅是最多监听十多个描述符,用啥无所谓,如果是 ...
- 关于分部视图(Partial View)
一.关于分部视图(Partial View) Partial View是可以应用在View中的,编写一次,在其他View中可以被反复使用.通常都是放在"Views——Shared" ...
- 非变动性算法源代码分析与使用示例( for_each、min_element 、find_if、search 等)
非变动性算法代码分析与示例: 一.for_each C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // TEMPLATE FUNCTION for_eac ...
- layui数据表格自定义每页条数limit
table.render({ elem: '#data_grid' //,width: 900 //,height: 274 ,cols: [[ //标题栏 {field: 'id', title: ...
- 查看Linux是32位还是64位的方法
发布:JB01 来源:脚本学堂 [大 中 小] 本文介绍下,快速查看linux系统是32位还是64位的方法,有需要的朋友参考下吧. 本节内容:查看linux操作系统的位数 一,方法A:un ...
- UIScrollView 滚动视图—IOS开发
转自:http://blog.csdn.net/iukey/article/details/7319314 UIScrollView 类负责所有基于 UIKit 的滚动操作. 一.创建 CGRect ...
- PL/SQL developer连接oracle出现“ORA-12154:TNS:could not resolve the connect identifier specified”问题的解决
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/50728536 本文出自[我是干勾鱼的博客] 使用PL/SQL developer ...
- quick cocos2d-x 2.2.4 window环境调试
BabeLua简介 BabeLua是一款基于VS2012/2013(简称VS)的免费开源的Lua集成开发环境,在Lua编辑和调试方面,具有如下功能和特性: ●Lua语法高亮 ●语法检查 ●自动补全 ● ...
- Cannot proceed with delivery: an existing transporter instance is currently uploading this package
当使用Xcode的Application Loader上传spa到AppStore的过程中,如果临时中断,当你再次进行上传的过程时,就发发现如下现象: Cannot proceed with deli ...
- Unix系统编程()malloc和free的实现
尽管malloc和free所提供的内存分配接口比之brk和sbrk要容易许多,但在使用时仍然容易犯下各种编程错误. 理解malloc和free的实现,将使我们洞悉产生这些错误的原因以及如何才能避免此类 ...