当前位置:文档之家› 软件设计模式(ppt文档)

软件设计模式(ppt文档)

private: Log(); static Log * theOnlyInstance; HANDLE hlogfile; LPSTR m_filename;
};
theOnlyInstance和一个公开的 静态函数getInstance ,前者 用来指向Log的唯一实例,后 者用来获取该实例的指针;
主程序 main.cpp
#include<log.h> void main() {
Log * pLog = Log::getInstance(); pLog->SetFile("myapp.log"); PLog->Print("App starts...") ... }
• 模式分析
– 在单例模式的实现过程中,需要注意如下三点:
系统分析与设计 之
设计模式
主讲人:张琪
什么是设计模式?
设计模式(Design pattern)是一套被 反复使用、多数人知晓的、经过分类编目 的、代码设计经验的总结。使用设计模式 是为了可重用代码、让代码更容易被他人 理解、保证代码可靠性。
设计模式使代码编制真正工程化;设计 模式是软件工程的基石脉络,如同大厦的 结构一样。
• 单例类的构造函数为私有; • 提供一个自身的静态私有成员变量; • 提供一个公有的静态工厂方法。
• 模式优缺点
– 单例模式的优点
• 提供了对唯一实例的受控访问。因为单例类封装了 它的唯一实例,所以它可以严格控制客户怎样以及 何时访问它,并为设计及开发团队提供了共享的概 念。
• 由于在系统内存中只存在一个对象,因此可以节约 系统资源,对于一些需要频繁创建和销毁的对象, 单例模式无疑可以提高系统的性能。
GOF书中一共介绍了23种设计模式。常用 的有15种。
创建型设计模式
创建型设计模式抽象了实例化过程,一 个类创建型模式使用继承改变被实例化的 类,而一个对象创建型模式将实例化委托 给另一个对象。
举例:Singleton(单件)
• 单件模式也称为单例模式、单子模式,是 使用最广泛的设计模式之一。其意图是保 证一个类仅有一个实例,并提供一个访问 它的全局访问点,该实例被所有程序模块 共享。有很多地方需要这样的功能模块, 如系统的日志输出,GUI应用必须是单鼠标, MODEM的联接需要一条且只需要一条电话 线,操作系统只能有一个窗口管理器,一 台PC连一个键盘等等。
virtual ~Log(); private:
HANDLE hlogfile;
向日志文件中写入一段信息。还 申明了一个全局变量g_log。
LPSTR m_filename;
};
extern Log g_log;
log.cpp中
# include "log.h"
Log::log() {...} void Log::Print(LPSTR format,...) {...} void Log::SetFile(LPSTR filename) {...} ~Log::log() {...} Log g_log;
• 允许可变数目的实例。我们可以基于单例模式进行 扩展,使用与单例控制相似的方法来获得指定个数 的对象实例。
• 模式优缺点
– 单例模式的缺点
• 由于单例模式中没有抽象层,因此单例类的扩展有很大 的困难。
• 单例类的职责过重,在一定程度上违背了“单一职责原 则”。因为单例类既充当了工厂角色,提供了工厂方法, 同时又充当了产品角色,包含一些业务方法,将产品的 创建和产品的本身的功能融合到一起。
• 《Design Patterns》 由 Erich Gamma、 Richard Helm、
Ralph Johnson 和 John Vlissides 合著 (Addison-Wesley,1995)。
这几位作者常被称为“四人组 (Gang of Four)”,而这本书也就被称为 “四人组(或 GoF)”书。
在需要记录日志的地方可以直 接使用,g_log和相关接口函 数。
主程序 main.cpp
#include<log.h> void main() {
g_log.SetFile("myapp.log"); g_log.Print("App starts....."); }
• 存在的问题:
• 一般情况下,只需要一个Log实例即可,但 上述做法不能保证Log的实例只有一个,当 多个实例设置相同的日志文件的时候,还 可能引起冲突;
log.cpp中
# include "log.h"
Log * log::theOnlyInstance=0; Log * Log::getInstance() {
if (!theOnlyInstance) theOnlyInstance = new Log();
return theOnlyInstance; //确保返回唯一实例 }; ...
Log.h中
#include<stdarg.h> #include<windows.h>
• C{ 某个Plausbs些,licL:o场就g 合可,使需用要Sin保gl证et某oh件lno的些模gf句il类e式柄和的。和m_名实fi字le例n,a只m即e向有记哪录一个日文志件文
• 例一Lvvooo如个iigdd()SP;:日eritnFt在志i(leL(PL一实SPTSR个例TRfo应即frimlean用 可ta,.m..程 。)e;); 序里接日写口志内入函文部日数件,志:的。S名一e字Lt般Fo。igle类只P函向ri数需n外t函用要提数来供用设两来置个
• 这种做法使得g_log无论用到与否都要被创 建。
• 为此,可以使用Singleton模式,改写类Log 的定义(文件log.h)如下:
#include<stdarg.h> #include<windows.h>
Class Log {
Public: static Log * getInstance(); void Print (LPSTR format,...); void SetFile(LPSTR filename); virtual ~Log();
相关主题