百独托管7500 紫田网络超高转化播放器收cps[推荐]速盾CDN 免实名免备防屏蔽阿里云 爆款特卖9.9元封顶提升alexa、IP流量7Q5团队
【腾讯云】中小企福利专场【腾讯云】多款产品1折起高防 随时退换 好耶数据小飞国外网赚带你月入万元炎黄网络4H4G10M 99每月
香港带宽CN2/美国站群优惠中客数据中心 服务器租用联盟系统移动广告平台 中易企业专场腾讯云服务器2.5折九九数据 工信部正规资质
腾讯云新用户大礼包代金券高价收cpa注册量高价展示【腾讯云】2核2G/9.93起租服务器找45互联 随时退换阿里云 短信服务 验证秒达

[官方推荐] ~~~[C#.NET]单件模式(Singleton Pattern)代码小解?!~~~ [复制链接]
查看:5035 | 回复:8

390

主题

5万

帖子

3万

积分

落伍者(四季发财)

退休见习T王

Rank: 4

贡献
2295
鲜花
38
注册时间
2004-6-2

落伍热心人落伍群众领袖QQ绑定落伍微信绑定落伍者落伍手机绑定

发表于 2006-12-26 16:19:39 | |阅读模式 来自 中国湖北武汉
如果你正在学习设计模式,或者想学习设计模式,这篇文章可能对你有用;如果不是,那你就只有路过了。。

Singleton是设计模式中比较特殊的一种,也是比较浅的一种,闲来无事,写出来。

希望对各位有用,顺便也是自己温习一下。

这篇文章主要只是讲解了代码中一些不是特别容易懂的地方,关于深层的东西,本人没资力,所以无法写出。

Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。

Singleton的主要就是为了限制每个类仅仅只有一个实例。

说多的理论东西可能还会让你头晕。。如果上面的那些话看着似懂非懂。还是看代码比较好。。
代码一:
  1. public sealed class Singleton
  2. {
  3.     static Singleton instance=null;

  4.     Singleton()
  5.     {
  6.     }

  7.     public static Singleton Instance
  8.     {
  9.         get
  10.         {
  11.             if (instance==null)
  12.             {
  13.                 instance = new Singleton();
  14.             }
  15.             return instance;
  16.         }
  17.     }
  18. }
复制代码

类前面的sealed是防止该类被继承,从而破坏该类只能一个实例的要求。

定义了一个静态的Singleton类型变量。

给了一个只读属性Instance 返回类型为Singleton

首先判断定义的instance是不是为空,就是验证有没有被实例化过。

如果有,返回之前实例化的那个,否则重新实例化一个新对象。

问题:此代码对于多线程的程序不是很好。

当两个线程同时判断if (instance==null)时。

可能同时创建两个新对象。

代码二:
  1. public sealed class Singleton
  2. {
  3.     static Singleton instance=null;
  4.     static readonly object padlock = new object();

  5.     Singleton()
  6.     {
  7.     }

  8.     public static Singleton Instance
  9.     {
  10.         get
  11.         {
  12.             lock (padlock)
  13.             {
  14.                 if (instance==null)
  15.                 {
  16.                     instance = new Singleton();
  17.                 }
  18.                 return instance;
  19.             }
  20.         }
  21.     }
  22. }
复制代码
这段代码借助了一个另一个对象来达到安全线程的效果。

当访问Instance属性时。

锁定当前线程,这样就不会出现两个线程同时创建的结果。。

提示:为什么要借助另一个对象?。因为如果这个时候lock(instance)

这个时候 instance 为空的话,会报错。

代码三:
  1. public sealed class Singleton
  2. {
  3.     static Singleton instance=null;
  4.     static readonly object padlock = new object();

  5.     Singleton()
  6.     {
  7.     }

  8.     public static Singleton Instance
  9.     {
  10.         get
  11.         {
  12.             if (instance==null)
  13.             {
  14.                 lock (padlock)
  15.                 {
  16.                     if (instance==null)
  17.                     {
  18.                         instance = new Singleton();
  19.                     }
  20.                 }
  21.             }
  22.             return instance;
  23.         }
  24.     }
  25. }
复制代码
这段代码首先判断空,然后锁定,由于多线程同时访问的机率就很小,而且不是每次都锁定线程。所以此方法不错。

问题:这段代码在Java中无法工作。

代码四:
  1. public sealed class Singleton
  2. {
  3.     static readonly Singleton instance=new Singleton();

  4.     // Explicit static constructor to tell C# compiler
  5.     // not to mark type as beforefieldinit
  6.     static Singleton()
  7.     {
  8.     }

  9.     Singleton()
  10.     {
  11.     }

  12.     public static Singleton Instance
  13.     {        
  14.         get
  15.         {
  16.             return instance;
  17.         }
  18.     }
  19. }
复制代码
这段代码它依赖公共语言运行库来初始化变量,所以执行控制的权力比较小。

而且当调用类中其他方法时,会实例化对象。

问题:无法达到延时实例化。

代码五:
  1. public sealed class Singleton
  2. {
  3.     Singleton()
  4.     {
  5.     }

  6.     public static Singleton Instance
  7.     {
  8.         get
  9.         {
  10.             return Nested.instance;
  11.         }
  12.     }
  13.    
  14.     class Nested
  15.     {
  16.         // Explicit static constructor to tell C# compiler
  17.         // not to mark type as beforefieldinit
  18.         static Nested()
  19.         {
  20.         }

  21.         internal static readonly Singleton instance = new Singleton();
  22.     }
  23. }
复制代码

这里,初始化工作由Nested类的一个静态成员来完成,这样就实现了延迟初始化。

只要不访问Instance属性,访问Singleton类中其他方法都不会初始化对象。值得推荐。

OK。五段代码说完了。。自己的理解。基本没什么错误吧。。

希望对各位初学者有点用处了。。^^

代码出处http://www.yoda.arachsys.com/csharp/singleton.html

[ 本帖最后由 传说中的Kid 于 2006-12-26 16:45 编辑 ]
未将对象引用设置到对象的实例

2

主题

5439

帖子

161

积分

落伍者(一心一意)

联盟专员

Rank: 1

贡献
49
鲜花
0
注册时间
2006-11-18
发表于 2006-12-27 10:43:21 | 来自 中国四川眉山
学习
头像被屏蔽

49

主题

2366

帖子

2110

积分

落伍者(两全齐美)

Rank: 2

贡献
1566
鲜花
1
注册时间
2007-2-6

QQ绑定

发表于 2010-6-15 21:12:54 | 来自 中国安徽合肥
bucuo .
学习、收藏
签名被屏蔽

69

主题

1935

帖子

824

积分

落伍者(一心一意)

Rank: 1

贡献
1419
鲜花
2
注册时间
2010-3-19
发表于 2010-6-16 14:59:17 | 来自 中国北京
。net真先进,学习

144

主题

2097

帖子

3917

积分

落伍者(两全齐美)

Rank: 2

贡献
1782
鲜花
4
注册时间
2010-5-31

QQ绑定

发表于 2010-8-18 14:02:30 | 来自 中国江苏苏州
这才是好帖啊,技术贴
千库网-免费beijing图片素材下载588ku.com
头像被屏蔽

18

主题

936

帖子

986

积分

落伍者(一心一意)

Rank: 1

贡献
768
鲜花
4
注册时间
2010-8-17

QQ绑定

发表于 2011-7-10 15:37:36 | 来自 中国广东深圳
代码不是很懂,高手哇,多学习学习

13

主题

852

帖子

121

积分

落伍者(一心一意)

Rank: 1

贡献
1244
鲜花
0
注册时间
2011-11-13
发表于 2011-12-22 11:20:49 | 来自 中国福建福州
C#的模式 已经很久没有接触了!
拉杆箱品牌排名www.xiangbaolao.com(箱包佬专业箱包资讯分享平台)

38

主题

252

帖子

41

积分

落伍者(一心一意)

Rank: 1

贡献
39
鲜花
0
注册时间
2012-2-11

落伍者

发表于 2012-2-15 12:11:42 | 来自 中国河北邢台
支持一下!好

34

主题

127

帖子

5

积分

落伍者(一心一意)

Rank: 1

贡献
28
鲜花
0
注册时间
2011-11-19
发表于 2012-5-14 21:26:03 | 来自 中国安徽马鞍山
学习了,感谢
莱珀妮  la prairie yitao.web-8
论坛客服/商务合作/投诉举报:2171544 (QQ)
落伍者创建于2001/03/14,本站内容均为会员发表,并不代表落伍立场!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
落伍官方微信:2030286 邮箱:(djfsys@gmail.com|tech@im286.com)
© 2001-2014

浙公网安备 33060302000191号

浙ICP备11034705号 BBS专项电子公告通信管[2010]226号

  落伍法律顾问: ITlaw-庄毅雄

手机版|找回帐号|不能发帖?|Archiver|落伍者

GMT+8, 2024-6-19 00:21 , Processed in 0.191996 second(s), 35 queries , Gzip On.

返回顶部