📄 csdn_文档中心_泛型编程与设计新思维.htm
字号:
<P> policies和policy类,是一种重要的类设计技术,所谓policy,是用来定义一个类或类模板的接口,该接口由下列之一或全部组成:内部类型定义、成员函数和成员变量。基于policy的类由许多小型类(称为policies)组成,每一个这样的小型类只负责单纯如行为或结构的某一方面。Policies机制由模板和多重继承组成,它们可以互相混合搭配,从而形成设计戎的多样性,通过plicy类,不但可以定制行为,也可以定制结构。
</P>
<P> 下面简单举例说明泛化思维和面向对象思维在部分设计模式中的运用。 </P>
<P> Singletons设计模式泛化实现
Singleton模式是一种保证一个对象(class)只有一个实体,并为它提供一个全局访问点。Singleton是一种经过改进的全局变量,既在程序中只能有唯一实体的类型,它的重点主要集中在产生和管理一个独立对象上,而且不允许产生另一个这样的对象。
<BR></P>
<P> 先让我们看看一般的C++实现的基本手法,下面是实现源码: // Singleton.h文件中<BR></P>
<P>class Singleton<BR>{<BR>public:</P>
<P>static Singleton&
Instance()<BR>{<BR>if(!pInstance_){<BR>if(destroyed_){ //
引用是否已经失效<BR>OnDeadReference();<BR>}<BR>else {<BR>Create(); //
第一次时创建实例<BR>}<BR>}<BR>return
*pInstance_;<BR>}<BR>private:<BR>Singleton(); //
禁止默认构造<BR>Singleton(const Singleton&); //
禁止拷贝构造<BR>Singleton& operator= (const Singleton&); //
禁止赋值操作<BR>static void Create() // 传加创建的实例引用</P>
<P><BR>static Singleton theInstance;<BR>pInstance_ =
&theInstance;<BR>}<BR>static void
OnDeadReference()<BR>{<BR>throw std::runtime_error("
实例被不正当消毁");<BR>}<BR>virtual ~Singleton()<BR>{<BR>pInstance- =
0;<BR>destroyed_ = true;<BR>}<BR>static Singleton
*pInstance_;<BR>static bool destroyed_;<BR>}<BR>//
Singleton.cpp中静态成员变量初始化<BR>Singleton* Singleton::pInstance_ =
0;<BR>Bool Singleton::destroyed_ = false;</P>
<P> 如上所示,Singleton模式实现中只有一个public成员Instance()用来第一次使用时创建单一实例,当第二次使用时静态变量将已经被设定好,不会再次创建实例。还将默认构造函数、拷贝构造函数和赋值操作符放在private中,目地是不让用户使用它们。另外,为避免实例意外消毁后再实例化情况,加入静态布尔变量destroy_来进行判断是否出错,从而达到稳定性。<BR></P>
<P> 从上面一般实现可以看出Singleton模式实现主要在于创建(Creation)方面和生存期(Lifetime)方面,既可以通过各种方法来创建Singleton。Creation必然能创建和摧毁对象,必然要开放这两个相应函数,将创建作为独立策略分离开来是必需的,这样你就可以创建多态对象了,所以泛化Singleton并不拥有Creator对象,它被放在CreationPolicy<T>类模板之中。生命期是指要遵循C++规则,后创建都先摧毁,负责程序生命期某一时刻摧毁Singleton对象。
</P>
<P> 下面是一个简单的泛化Singleton模式的实现(不考虑线程因素) </P>
<P>template<BR><<BR>class T,<BR>template<class> calss
CreationPolicy = CreateUsingNew,<BR>template<class>
class LifetimePolicy=DefaultLifetime,<BR>><BR>classs
SingletonHolder<BR>{<BR>public:<BR>static T&
Instance()<BR>{<BR>if(!pInstance_)<BR>{<BR>if(destroyed_)
<BR>{<BR>LifetimePolicy<T>::OnDeadReference();<BR>destroyed_
= false;<BR>}<BR>pInstance_ =
CreationPolicy<T>::Create();<BR>LifetimePolicy<T>::SchedultCall(&DestorySingleton);<BR>}<BR>return
*pInstance_;<BR>}<BR>private:<BR>static void
DestroySinleton()<BR>{<BR>assert(!destroyed_);<BR>CreationPlicy<T>::Destroy(pInstance_);<BR>pInstance_
= 0;<BR>destroyed_ = true;<BR>}</P>
<P>SingletonHolder();<BR>SingletonHolder (const
SingletonHolder &); <BR>SingletonHolder & operator=
(const SingletonHolder &); </P>
<P>Static T* pInstance_;<BR>Static bool destroyed_;<BR>};</P>
<P> Instance()是SingletonHolder开放的唯一一个public函数,它在CreationPolicy、LifetimePolicy中打造了一层外壳。其中模板参数类型T,接收类名,既需要进行Singleton的类。模板参数内的类模板缺省参数CreateUsingNew是指通过new操作符和默认构造函数来产生对象,DefaultLifetime是通过C++规则来管理生命期。LifetimePolicy<T>中有二个成员函数,ScheduleDestrution()函数接受一个函数指针,指向析构操作的实际执行函数,如上面DestorySingleton析构函数;OnDeadReference()函数同上面一般C++中同名函数相同,是负责发现失效实例来抛出异常的。CreationPlicy<T>中的Create()和Destroy()两函数是用来创建并摧毁具体对象的。
</P>
<P> 下面是上述泛化Singleton模式实现的使用: </P>
<P>1、应用一 class A{};<BR>typedef SingletonHolder<A,
CreateUsingNew> SingleA;</P>
<P>2、应用二 class A{};<BR>class Derived : public A
{};<BR>template<class T> struct MyCreator : public
CreateUsingNew<T><BR>{<BR>static T*
Create()<BR>{<BR>return new Derived;<BR>}<BR>static void
Destroy(T* pInstance)<BR>{<BR>delete
pInstance;<BR>}<BR>}<BR>typedef
SingletonHolder<A,MyCreator> SingleA;</P>
<P> 通过上面示例可以看出,
SingletonHolder采用基于plicy设计实现,它将Singleton对象分解为数个policies,模板参数类中CreationPolicy和LifetimePolicy相当于二个policies封装体。利用它们可以协助制作出使用者自定义的Singleton对象,同时还预留了调整和扩展的空间。由此而得,泛型组件(generic
components),是一种可复用的设计模板,结合了模板和模式,是C++中创造可扩充设计的新方法,提供了从设计到代码的简易过渡,帮助我们编写清晰、灵活、高度可复用的代码。
</P>
<P><FONT color=#ff0000>参考文献</FONT> <BR></P>
<P>C++ Primer(第三版) --- 潘爱民等译 <BR>Effective C++(第二版) --- 侯捷译
<BR>More Effective C++ --- 侯捷译 <BR>Exceptional C++ --- 卓小涛译
<BR>More Exceptional C++ --- 於春景译 <BR>深度探索C++对象模型 --- 侯捷译
<BR>泛型编程与STL --- 侯捷译 <BR>C++ STL程序员开发指南 --- 彭木根等箸
<BR>设计模式:可复用面向对象软件的元素 --- 李英军等译 <BR>C++设计新思维 --- 侯捷等译
</P></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0
width=770>
<TBODY>
<TR bgColor=#006699>
<TD align=middle bgColor=#006699 id=white><FONT
color=#ffffff>对该文的评论</FONT></TD>
<TD align=middle>
<SCRIPT src="CSDN_文档中心_泛型编程与设计新思维.files/readnum.htm"></SCRIPT>
</TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_泛型编程与设计新思维.files/ico_pencil.gif" width=16>
</SPAN> tudou614 <I>(2004-5-6 12:33:44)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>其实这本书不错|《泛型编程与设计新思维|》
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_泛型编程与设计新思维.files/ico_pencil.gif" width=16>
</SPAN> hjmaAsC <I>(2004-5-6 2:18:00)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3
width=532><BR>请问朋友,这篇文章是从哪里翻译来的啊?可以加上一点解释说明吗?这样更有利于偶们这些百姓的理解啊!
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_泛型编程与设计新思维.files/ico_pencil.gif" width=16>
</SPAN> zjh135 <I>(2004-5-5 22:02:13)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>现在的VBNET没有这样的功能吧?
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_泛型编程与设计新思维.files/ico_pencil.gif" width=16>
</SPAN> iampolaris <I>(2004-4-28 21:59:38)</I>
</TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>look <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_泛型编程与设计新思维.files/ico_pencil.gif" width=16>
</SPAN> STARPACS <I>(2004-4-28 10:37:41)</I>
</TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>收藏
<BR></TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TH bgColor=#006699 id=white><FONT
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
<TBODY>
<TR>
<TD>你没有登陆,无法发表评论。 请先<A
href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=27300">登陆</A>
<A
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
<TBODY>
<TR align=middle>
<TD height=10 vAlign=bottom><A
href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A
href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A
href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A
href="http://www.csdn.net/english">English</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
border=0 height=48 src="CSDN_文档中心_泛型编程与设计新思维.files/biaoshi.gif"
width=40></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -