设计模式入门(1)------------单件(Singleton)

hyqryq 2001-09-22 11:31:31
设计模式入门(1)------------单件(Singleton)

作者的话:
大家都说, C++难 , 难在那里 , 难在他的面向对象OO部分. 而OO的设计, 又是OO的难点
. 设计模式描述了面向对象领域中经常出现的一类固定问题 ,和他比较固定的解决方法. 这样
,你就可以一次次的重用这种解决方法而不必作重复的劳动. 但是经典书籍<<Design Pattern
>>比较晦涩, 想想我自己, 也是花费了许多时间去揣摩书中的含义. 现在精通设计模式的高手
很多, 不过他们大都很忙. 我想, 我可以花去一些休息时间去为我们的众多C++ fans去做一些
有意义的事情. 我的水平不高, 文中必有一些错误, 欢迎高手们的指正.
我是个C++谜, 我经常去www.cuj.com ,在我的文章中, 你也会发现Jim Hyslop and Herb Su
tter 的影子.
我希望把模式以浅显易懂的方式介绍给大家. 如果你觉得这篇文章颇对你的胃口, 或是对你
有一点帮助, hahaha, Its my pleasure. 也对我来一些鼓励吧! 大家的鼓励可是我写作的动
力呦! (^-^)
-------------------------------------------------------------------------
" 喂喂喂, Grant 你在干吗? ", 这个家伙整个上午都把他那只派克笔转过来转过去, 搞得我
心烦不已 . "你可不可以安静点儿 ! ", 我说 .
" 我有个问题无法解决. " Grant 说, " 我设计了一个钟表类, 他需要一个唯一个时钟来对
程序中的其他的一些其他的定时器进行协调. 我不想生成第二个时钟! ", "那么你怎么做的
呢? " 我饶有兴趣的问. "我想使用全局变量, 可是我没有办法让我那该死的时钟类只生成唯
一的实例." 而且, 他接着说 "这个程序太大了, 并不是我一个人完成的. 如果只是我一个人
, 我可以记住只把时钟类实例化一次, 可是, 我还有许多partner , 这并不是一个好方法 ,我
想从设计上保证它! "
想想昨晚刚刚我刚看完设计模式上一个有关保证一个类仅有唯一实例的方法单件(Singleton
), 我不由得喜上心头, 哈哈哈, 可以卖弄一下了! ".
" 你可以把构造函数定义成非公有的, 就可以保证不会生成实例了. " 我笑着说.
" My god , 不会吧 , 非公有的构造函数 , 我可从来没有想过………… 那么我如何生成我
的唯一的时钟呢? 如果是非公有的构造函数中, 那么我好象也没有办法对时钟类实例化………
"
"你可以定义一个对类操作的static型函数, 在这个函数中实例化不就行了么! "
"我还是不太明白! ", Grant 眨了眨眼睛.

我提笔写下以下的例子:

class Singleton
{
public :
static Singleton* Instance ( );
protected :
singleton ( ) ;
private :
static Singleton* _instance ;
};

Singleton* Singleton::_instance = 0;

Singleton* Singleton::Instance ( )
{
if(_instance == 0)
{
_instance = new Singleton;
}
return _instance;
}

" 这里, Instance函数是static 型函数, 他可以对类进行操作, 而 _instance 是static型
变量, 它只与类相关. Instance 使用惰性初始化, 它直到第一次被调用时才创建唯一的Sing
letion实例. 而构造函数你可以定义为 private型, 这里定义为 protect 型, 可以使你在子
类的函数中重用它, 这样, 如果有人想用Singleton去实例化对象, 就会得到一个编译错误,
他只能通过Instance函数去方问唯一的对象, 明白了吗? "

" 你真是个天才, 这个想法太棒了, 如果我是MM的话, 我一定会嫁给你的! "
" 嫁给我 , 还是算了吧 ! 快去写你的程序. "
看着Grant 的背影, 我吐了吐舌头 , 哈, 天才, 究竟是不是天才, 只有我自己知道!


--------------------------------------------------------------------------------
--------------------------------------
大家看看题目, 设计模式入门, 记住, 这只是入门! 这里介绍的十分浅显. 如果你想要有提
高的话, 还是看<<Design Pattern>>. (哈哈哈, 如果你仔细看的话, 你会发现作者抄袭了好
多! )

作者: hyqryq




...全文
245 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
gigix 2001-10-12
  • 打赏
  • 举报
回复

singleton模式的一种变体:double-checked locking

在单线程下,我们的singleton多半是这样(java):
class Singleton{
private Singleton(){ //... };
private static Singleton instance = null;
public static Singleton getInstance
{
if ( instance == null )
instance = new Singleton();
return instance;
};
//...
}

但是在多线程环境下,这里有个问题:如果一个线程先检查了instance==null,然后开始创建新的实例;同时另一个线程又来检查instance==null(此时第一个线程的创建还没完成),然后也创建新的实例。这样就有了Singleton类的两个实例——我们的singleton模式失败了。

所以我们应该加入同步代码。但是加在哪里呢?如果每个线程都需要同步再获得实例引用,这必然会形成一个瓶颈;如果在instance==null的检查后面加同步代码……这根本没有用。为什么?自己想想吧。

我们应该怎么办?同步代码肯定应该在instance==null的后面,同时,在创建新对象之前应该再检查一次instance==null:
class Singleton{
//...
private synchronized static void doSync(){
//在这里同步
}
public Singleton getInstance(){
if(instance==null){
Singleton.doSync();
if(instance==null) // 再进行一次检查
instance = new Singleton();
}
return instance;
}

两次检查,既避免了效率瓶颈,又避免了重复创建。这就是double-checked locking模式。
kk_liwei 2001-09-26
  • 打赏
  • 举报
回复
写的不错,期待!
iamcobain 2001-09-26
  • 打赏
  • 举报
回复
up
Sword_Sharp 2001-09-26
  • 打赏
  • 举报
回复
gz
feeling2000 2001-09-26
  • 打赏
  • 举报
回复
哈哈, 再接再厉。 :) 大家期待着呢。
renwind 2001-09-25
  • 打赏
  • 举报
回复
gz
wilddragon 2001-09-24
  • 打赏
  • 举报
回复
天生我才必有用
wilddragon 2001-09-24
  • 打赏
  • 举报
回复
值得注意
lostmouse 2001-09-24
  • 打赏
  • 举报
回复
真不错!!后生可畏啊!
小伙子有前途!
cber 2001-09-24
  • 打赏
  • 举报
回复
有点仿照Conversations,虽说singleton是所有patterns里面最简单的一个(个人认为),但这篇文章还是不错的。
另外,给个建议,“惰性初始化”(lazy evaluation)改为“缓式初始化”如何?惰性听起来很不爽,而缓式则要好一些^_^
magicblue 2001-09-23
  • 打赏
  • 举报
回复
不错,继续
trustme 2001-09-23
  • 打赏
  • 举报
回复
我居然看不懂?!天啊,做个记号,以后再来。
miame 2001-09-23
  • 打赏
  • 举报
回复
我打算去看设计模式。
hyqryq 2001-09-23
  • 打赏
  • 举报
回复
如果不出意外, 我打算每周写一篇。

大家的鼓励可是我写作的动力呦! (^-^)
740609 2001-09-23
  • 打赏
  • 举报
回复
能不能写完?我好想看
hyqryq 2001-09-23
  • 打赏
  • 举报
回复
谢谢捧场, 是不才我的原创! (*^-^*)
gigix 2001-09-23
  • 打赏
  • 举报
回复

请问这是哪里来的文章?是原创吗?写得很不错呀。希望与你联系:gigix@263.net
Only_I 2001-09-23
  • 打赏
  • 举报
回复
kao,天才!
hyqryq 2001-09-22
  • 打赏
  • 举报
回复
也已贴到文档中心了!
Head.First设计模式_PDF(高清扫描版) 第一部分(共三部分) 在我的资源下可找到其他两部部分 强大的写作阵容。《Head First设计模式》作者Eric Freeman和ElElisabeth Freeman是作家、讲师和技术顾问。Eric拥有耶鲁大学的计算机科学博士学位,E1isabath拥有耶鲁大学的计算机科学硕士学位。Kathy Sierra(javaranch.com的创始人)FHBert Bates是畅销的HeadFirst系列书籍的创立者,也是Sun公司Java开发员认证考试的开发者。本书的产品设计应用神经生物学、认知科学,以及学习理论,这使得这本书能够将这些知识深深地印在你的脑海里,不容易被遗忘。本书的编写方式采用引导式教学,不直接告诉你该怎么做,而是利用故事当作引子,带领读者思考并想办法解决问题。解决问题的过程中又会产生一些新的问题,再继续思考、继续解决问题,这样可以加深体会。作者以大量的生活化故事当背景,例如第1章是鸭子,第2章是气象站,第3章是咖啡店,书中搭配大量的插图(几乎每一页都有图),所以阅读起来生动有趣,不会感觉到昏昏欲睡。作者还利用歪歪斜斜的手写字体,增加“现场感”。精心设计许多爆笑的对白,让学习过程不会太枯燥。还有模式告白节目,将设计模式拟人化成节目来宾,畅谈其内在的一切。本书大量采用uML的class Diagram(Static Structure Diagram)。书中的例子程序虽然都是用JaVa编写,但是本书所介绍的内容对于任何00语言的用户都适用,包括c++和c+。每一章都有数目不等的测验题。每章最后有一页要点整理,这也是精华所在,我都是利用这一页做复习。   《Head First设计模式》共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Templat Method、Iterator、Composite、State、Proxy。最后三章比较特别。第12章介绍如何将两个以上的设计模式结合起来成为新的设计模式(例如著名的MVC模式),作者称其为复合设计模式(这是作者自创的名称,并非四人组的标准名词),第13章介绍如何进一步学习设计模式,如何发觉新的设计模式等主题,至于第14章则很快地浏览尚未介绍的设计模式,包括Bridge、Builder、Chain of Responsibility、Flyweight、Interpreter、Mediator、Memento、Prototype、Visitor。第1章还介绍了四个OO基本概念(抽象、封装、继承、多态),而第1章到第9章也陆续介绍了九个OO原则(Principle)。千万不要轻视这些OO原则,因为每个设计模式背后都包含了几个OO原则的概念。很多时候,在设计时有两难的情况,这时候我们必须回归到OO原则,以方便判断取舍。可以这么说:OO原则是我们的目标,而设计模式是我们的做法。 目录 引子 谁适合读这本书? 我们知道你的大脑在想什么 元认知 让你的大脑就范 技术审校 致谢 1 欢迎来到设计模式世界:设计模式入门 模拟鸭子应用 Joe想到继承 利用接口如何? 软件开发的不变真理 分开变化和不变部分 设计鸭子的行为 测试鸭子的代码 动态地设置行为 封装行为的大局观 “有一个”比“是一个”更好 策略模式 共享模式词汇的威力 我如何使用设计模式? 设计箱内的工具 习题解答 2 让你的对象知悉现况 气象观测站 认识观察者模式 出版者+订阅者=观罕者模式 五分钟短剧:观察主题 定义观察者模式 松耦合的威力 设计气象站 实现气象站 使用Java内建的观察者模式 java.util.Observable的黑暗面 设计箱内的工具 习题解答 …… 3 装饰者模式:装饰对象 4 工厂模式:烘烤OO的精华 5 单件模式:独一无二的对象 6 命令模式:封装调用 7 适配器模式与外观模式:随遇而安 8 模板方法模式:封装算法 9 送代器与组合模式:管理良好的集合 10 状态模式:事物的状态 11 代理模式:控制对象访问 12 复合模式:模式中的模式 13 与设计模式相处:真实世界中的模式 A 附录A:剩下的模式

15,447

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧