就他吧-9ta8为您提供:身份证查询、15位转16位身份证,手机号码归属地查询,IP地址查询服务,城市天气预报查询,列车时刻表简易快速查询等等查询服务,就他吧欢迎您的光临!!
梦幻Dot Net
科学地研究编程,品味开发的艺术
博客园
首页
新随笔
联系
订阅
管理
随笔-93 评论-626 文章-7 trackbacks-74
Dot Net设计模式—单件模式
1.概述
1.1意图
单件模式保证应用只有一个全局惟一的实例,并且提供一个访问它的全局访问点。
1.2使用场合
当类只能有一个实例存在,并且可以在全局访问时。这个惟一的实例应该可以通过子类实现扩展,并且用户无须更改代码即可使用。
我们前面介绍的工厂类经常被实例化为全局惟一的单件,可能的单件还有管理日志的对象、关键字生成对象和外部设备接口对象等。
1.3结构
单件模式的结构非常简单,包括防止其他对象创建实例的私有构造函数、保存惟一实例的私有变量和全局访问接口等。
1.4效果
单件提供了全局惟一的访问入口,因此易于控制可能发生的冲突。
单件是对类静态函数的一种改进,首先它避免了全局变量对系统的污染;其次农业经济可以有子类,可以定义虚函数,具有多态性。而类中的静态方法是不能定义为虚函数的,因此不具有多态性。
单件模式可以扩展为多件,即允许有受控的多个实例存在。
2..NET实现
单件模式的实现比较简单,要点如下。
(1)私有构造函数防止在外部实例化。
(2)保存惟一实例的静态的私有变量。
(3)初始化并获得惟一实例的静态方法。
VB代码如下:
Public
Class VBSingleton
Class
VBSingleton
Private
Shared
mySingleton
As
VBSingleton
Private
Sub New()
Sub
New
( )
End Sub
Public
Shared
Function GetInstance()
Function
GetInstance( )
As
VBSingleton
If
mySingleton
Is
Nothing
Then
MySingleton
=
New
VBSingleton
End
If
Return
mySingleton
End
Funtion
End Class
3.单件计数器
最简单的单件模式应用是计数器,在基于Web的应用中,我们希望有一个全局计数器来统计单击的次数。为此首先定义一个单件计数器:
public
Class Counter
Class
Counter
Private
intCounter
As
Integer
=
0
Private
Shared
myCounter
As
Counter
Public
Function Count()
Function
Count( )
As
Integer
IntCounter
=
intCounter
+
1
Return
intCounter
End Function
Public
Shared
Function GetInstance()
Function
GetInstance( )
As
Counter
If
myCounter
Is
Nothing
Then
MyCounter
=
New
Counter
End
If
Return
myCounter
End Function
End Class
然后在需要计数的页面前中增加调用代码:
Private
Sub Page()
Sub
Page
-
Load(
ByVal
sender
As
System.
Object
,
ByVal
e
As
System.EventArgs)
Handles
MyBase
.Load
If
Not
Page.IsPostBack
Then
Me
.Labell.Text
=
Counter.GetInstance.Count
End Sub
下面的代码模拟访问,每单击一次按钮,计数器加1:
Private
Sub Buttonl()
Sub
Buttonl
-
Click(
ByVal
semder
As
System.
Object
,
ByVal
e
As
System.EventArgs)
Handles
Buttonl.Click
Me
.Labell.Text
=
Counter.GetInstance.Count
End Sub
这个计数器是全局的,在Counter中保存状态。
4.全局变量与单件
在上例中,我们能否用一个窗体的全局变量来代替单件模式?我们定义一个静态的全局变量,在应用启动时初使化这个变量,然后可以在程序的任何地方使用这个变量。在这个例子中,是创建和打开一个窗体。如果我们关闭了这个窗体,会发现将无法再次打开,因为窗体的实例已经被销毁。惟一的办法是创建一个新窗体,因为无法知道哪些模块会调用这个窗体,因此在所有可能的地方都要判断这个窗体是否已经被销毁?是否需要重新创建?系统的维护量可想而知。
可以看出,单件模式维护自身的实例化,在使用时是安全的。一个全局对象无法自行维护,也就无法避免重复创建多个实例,系统资源会被大量占用。更糟糕的是在很多情况下会出现逻辑问题,当这些对象访问相同的资源(例如串口时)时,会发生访问冲突。
5.单件与实用类中的静态方法
实用类提供系统公用的静态方法,并且也经常采用私有化的构造函数。与单件不同,它没有实例,其中的方法全部是静态方法。
实用类与单件的区别如下。
(1)实用类不保存状态,仅提供功能。
(2)实用类不具有多态性,而单件可以有子类。
(3)单件是对象,实用类只是方法的集合。
应该说在实际应用中,实用类的使用更广泛,而在涉及对象的情况下需要使用单件。例如能否用实用类代替抽象工厂?如果用传统的实现方式,显然不可。因为实用类没有多态性,会导致每个具体工厂的接口不同,在这种情况下必须将工厂对象作为单件。
如果采用反射工厂,那么完全可以不采用单件模式,而将反射工厂作为实用类。因为只需要知道实例化的子类名称就可以完成实例化工作,具体工厂和抽象工厂已经合为一体,多态已无必要。
因此何时使用单件,何时使用实用类要具体情况具体分析,不能一概而论。当然,如果把实用类作为单处理,在实现上是可以的,但没有必要这样做。
posted on 2005-08-11 18:19
振河
阅读(2317)
评论(5)
编辑
收藏
所属分类:
.Net设计模式
评论:
#1楼
2005-08-12 08:52 |
mKiaTaeHee [未注册用户]
难。
回复
引用
#2楼
2005-08-12 08:57 |
振河
呵呵,我刚学设计模式的时候也感到没有头绪,特别枯燥,但是结合着实际的例子,再找几个成功运用模式的几个开源项目,仔细研究研究,不是很难的
回复
引用
查看
#3楼
2005-12-13 10:56 |
KingWorld [未注册用户]
个人认为将“单件”和“实用类”相提并论是不恰当的。
回复
引用
#4楼
2007-07-10 19:55 |
阿洛 [未注册用户]
单件模式就是单例模式吗?
回复
引用
#5楼
2007-10-02 16:35 |
flyskylf [未注册用户]
上面的代码好像在多线程的时候可能会出问题,有可能会有多个实例,应该在
If myCounter Is Nothing Then
MyCounter = New Counter
End If
处加一个锁.
回复
引用
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2005-08-24 08:59 编辑过
所属分类的其他文章:
·
Dot Net设计模式—MVC模式
·
用实例解说Dot Net设计模式——装饰模式
·
创建型模式之间的比较
·
.NET反射、委托技术与设计模式
·
Dot Net设计模式—适配器、桥接与外观三模式之间的关系
·
Dot Net设计模式—外观模式
·
如何在实际工作中发现模式(二)
·
如何在实际工作中发现模式(一)
·
Dot Net设计模式—桥接模式
·
Dot Net设计模式—适配器模式
最新IT新闻:
·
英特尔雅虎开发网络计算机频道
·
Windows Live视频邮件9月9日开始测试
·
Intel首次公开展示Nehalem架构迅驰3平台
·
Pogo浏览器
·
洪磊口述:番茄花园如何捆绑流氓软件月入十万
博客园新闻频道
博客园首页
社区
清新的空气清晰的你愉快的心情陪伴你,欢迎来到梦幻Dot Net。
<
2005年8月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(24)
给我留言
查看留言
我参与的团队
Design & Pattern团队(0/837)
.NET 控件与组件开发(1/1360)
敏捷软件开发组织(0/278)
北京.NET俱乐部(1/1446)
Dot Net Web服务和Windows服务开发(0/231)
正则表达式团队(0/2)
随笔分类
.Net设计模式(21)
ASP.Net(9)
C#(12)
C#2005(2)
DotText
JavaScript(8)
Reporting Services(6)
SD Channel
SQL Server 2000(10)
Visio Studio 2005 WPF(2)
Web and Windows Service(5)
其他(7)
软件工程(7)
正则表达式(2)
随笔档案
2008年3月 (1)
2008年1月 (2)
2007年12月 (1)
2007年11月 (1)
2007年10月 (4)
2007年8月 (1)
2007年7月 (1)
2007年5月 (1)
2007年4月 (1)
2007年3月 (1)
2007年1月 (2)
2006年12月 (1)
2006年10月 (1)
2006年9月 (2)
2006年8月 (1)
2006年7月 (1)
2006年4月 (1)
2006年3月 (4)
2006年2月 (1)
2006年1月 (1)
2005年12月 (1)
2005年11月 (1)
2005年10月 (5)
2005年9月 (11)
2005年8月 (36)
2005年7月 (10)
文章分类
ASP.NET(2)
安全与加密(1)
管理(1)
生活(1)
数据库(2)
文章档案
2007年12月 (1)
2005年10月 (1)
2005年9月 (1)
2005年8月 (4)
相册
宝贝动物
精彩贴图
生活餐具
.NET技术网站
ASP.NET开发实践系列课程
ASP酷技术网
CodeProject
KnowDotNet
Visual Studio.net专栏
博客堂
发赛特技术网
酷网博客
孟宪会.NET开发者园地
太平洋开发编程技术与实例
天新网DotNet
新一代技术网
站长中国
正则表达式
中国C#技术网站
中文C#站
其他技术网
ASP.NET Forums 官方中文网站
MSDN中文站
动态网站制作指南
正则表达式网站(Eng)
中国BS网
中国Office Online
中国WEB开发者网络
数据库技术网站
SQL Server 提示与技巧
数据仓库之路
友情连接
就他吧服务
就他吧为您提供软件开发,网站设计,网站开发维护,各种办公软件、管理软件开发等等,详情请进入
http://www.9ta8.com
幽默笑话
笑话大全、智慧快餐、暴笑网文、高笑图片、恐怖故事、幽默短信、相声小品尽在其中,就他吧幽默站开心您每一天
积分与排名
积分 - 248438
排名 - 121
最新评论
1. re: DotNet WebService和WindowsService团队开通
1.博客园帐户名:Clefoo 2.电子邮件:clefoo@126.com 3.博客园地址: 4.申请目的:学习和探讨Web服务或者Windows服务的 ...
--Clefoo的马甲
2. re: DotNet WebService和WindowsService团队开通
我非常希望加入 1.博客园帐户名:aierong 2.电子邮件:aierong@126.com 3.博客园地址: ...
--aierong
3. re: COM+组件与COM+服务使用的区别
你好,我想请教您两个问题,关于开发COM+方面的.可以加下我QQ吗,QQ:285625240
--wangjianguo
4. re: C#几种常用的排序算法
不错啊,呵呵,理解了,谢谢你啊
--顾客
5. re: DotNet WebService和WindowsService团队开通
我要加入
--草原和大树
阅读排行榜
1. 正则表达式基础知识(21308)
2. 全面剖析C#正则表达式(17993)
3. .NET反射、委托技术与设计模式(9786)
4. C#反射实例讲解(9711)
5. .Net调用Java的WebService之亲身体验(9251)
评论排行榜
1. DotNet WebService和WindowsService团队开通(123)
2. 如何掌握并在实践中自如运用设计模式(51)
3. C#写的一个代码生成器(35)
4. 用.Net开发Windows服务初探(27)
5. .NET反射、委托技术与设计模式(21)
就他吧-9ta8伴您开心每一天