Head First Design patterns笔记-Singleton patterns (从“一夫一妻制社会中婚约的达成”看单件模式)

定义:The singleton pattern ensures a class has only one instance, and provides a global point of access to it.

背景介绍:  在“一夫一妻”制的社会中,受道德约束,每个人(虽然本例是用girl’s engagement,但是实际不论对于男人或者女生都是成立的,^_^。)一旦有了婚约就不应该再接受其他的婚约。不知道现在还有没有“指腹为婚”和“娃娃亲”,虽然这与现在提倡的“婚姻自由,自主婚姻”等观念格格不入,但是与“一夫一妻”制度是没有冲突的,而且对于本例是很有用的。“指腹为婚”和“娃娃亲”映射到本例,就是early created singleton objectGirlsEngagement实例在外界访问以前已经存在了,所以大家不要再去试图追求一个从小就有了婚约的人。现实生活中并不是一个追求者去追一个被追求者这么简单,更多的时候可能是一对多的关系,多个人同时追求一个人(多线程问题),这个时候会出现非常非常多的问题,如果没有任何限制,这个被追求者同时有了多个婚约,后果真的不堪设想啊!轻则会有各种各样的纠纷,重则可能会搞得头破血流,你死我活。追求一个自己心仪的对象如果想更大可能性拿到婚约,最好是让别人知道某人正在被你追,但是这个时候你也要搞清楚,你喜欢的人是不是已经有了婚约,别跟大家说你要追某MM,结果发现人家早在一年前就订婚了(加了锁,然后发现girl's engagement已经创建了),最后不得不中途退出。英明的人总是做double check, 先看你心仪的对象有没有婚约,如果没有就加锁,表明你的MM已经名花有主。彪悍的人不管MM有没有婚约甚至不管人家是不是已经结婚,总是要加锁,然后去达成和MM的婚约―――当然这个和本文的singleton pattern没有关系,^_^那么对于本例来说,全局访问点是什么呢?因为你和一个人有了婚约后才可以实现的东西都应该属于全局访问点的范畴,比如你因为有了婚约所以每年都需要到对方的家里拜访,比如别人因为知道你们有了婚约而对你们时常一起散步不再感到奇怪等等。

实例代码:
查看代码


解释部分:
我尝试过使用多线程试图证实如果不加锁会生成多个singleton类的实例,但是很难成功,^_^,所以就把那部分代码删除了,如果谁能有好的办法证实这个问题,希望能告诉我。

对于单件中的加锁机制,大家可以参考《c#线程参考手册》,加锁的方式以及优劣分析的比较多。

Q/A:
1. 单件模式是不是应该用来继承,也就是把构造函数声明成protected?
不应该,因为一旦有了继承就会出现多个子类指向父类中 一个静态对象的引用,这不是我们想要的。

2.为什么不用静态全局变量代替单件模式?
静态全局变量只能在应用程序初始化的时候赋值,失去了单件模式中对象实时创建的灵活性,在资源比较珍贵的场景中尤其不是适合。



posted on 2007-06-10 11:55 zhanqiangz(闲云野鹤) 阅读(2014) 评论(9)  编辑 收藏 所属分类: 读书笔记Design Patterns

评论

#1楼  2007-06-10 12:10 小鬼 [未注册用户]

本来简单的东西被你这样一介绍就好像是高深的玩意了,强.   回复  引用    

#2楼  2007-06-10 12:16 ZergTant [未注册用户]

伊斯兰教怎么办   回复  引用    

#3楼  2007-06-10 16:04 自由、创新、研究、探索……      

生动有趣,赞一个   回复  引用  查看    

#4楼  2007-06-10 21:42 yaray [未注册用户]

public static GirlsEngagement GetGirlsEngagementWithDoubleCheck()
{
if (null != girlsEngageent) //这样可以提高性能
{
return girlsEngageent;
}

lock (writerLock)
{
if (null == girlsEngageent) // 这样更好些
{
girlsEngageent = new GirlsEngagement();
}
}
return girlsEngageent;
}
  回复  引用    

#5楼  2007-06-10 23:19 66ccff      

结果发现人家早在一年前就订婚了(加了锁,然后发现girl's engagement已经创建了),最后不得不中途退出。英明的人总是做double check, 先看你心仪的对象有没有婚约,如果没有就加锁,表明你的MM已经名花有主。彪悍的人不管MM有没有婚约甚至不管人家是不是已经结婚,总是要加锁,然后去达成和MM的婚约

觉得这个地方不太好啊。
第3者怎么解释,还有情人怎么解释?   回复  引用  查看    

#6楼 [楼主] 2007-06-11 09:24 zhanqiangz(闲云野鹤)      

@66ccff
引用原文:
在“一夫一妻”制的社会中,受道德约束,每个人(虽然本例是用girl’s engagement,但是实际不论对于男人或者女生都是成立的,^_^。)一旦有了婚约就不应该再接受其他的婚约。

彪悍的人不管MM有没有婚约甚至不管人家是不是已经结婚,总是要加锁,然后去达成和MM的婚约―――当然这个和本文的singleton pattern没有关系,^_^。   回复  引用  查看    

#7楼 [楼主] 2007-06-11 09:29 zhanqiangz(闲云野鹤)      

@yaray
多谢提醒,毕竟在访问代码时实例已经创建的时候情况要多得多,修改后的确比较合理.   回复  引用  查看    

#8楼  2007-06-11 19:58 1 [未注册用户]

似的饿额饿   回复  引用    

#9楼  2008-02-05 17:42 fox23      

有趣,收藏了。   回复  引用  查看    

<2007年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

公告

如转载本博客的相关资料敬请注明出处.谢谢合作!

与我联系

常用链接

留言簿(6)

我参与的团队

我的标签

随笔分类(51)

随笔档案(49)

文章分类(7)

文章档案(5)

收藏夹(3)

.NET

BizTalk

Design

JavaScript

My Blogs

Power Tools

Process Control

Search Engine

SQL Server

XML

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜