当前位置: 首页 > news >正文

CSharp面向对象设计模式纵横谈--Singleton Pattern 听课笔记

 

模式分类:

       从目的看:

              创建型(Creational)模式:负责对象创建

              结构型(Structural)模式:处理类与对象间的组合

              行为型(Behavioral)模式:类与对象交互中的职责分配

从范围看:

       类模式处理类与子类的静态关系

       对象模式处理对象间的动态关系

 

动机(Motivation

       在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性,以及良好的效率。

       如果绕过常规的构造器,提供一种机制类保证一个类只有一个实例?

       这应该是类设计者的责任,而不是使用者的责任。

 

意图(Intent

       保证一个类仅有一个实例,并提供一个全局访问点。

 

单线程Singleton模式实现

 1 None.gif Public  class  Singleton
 2 ExpandedBlockStart.gifContractedBlock.gif        dot.gif {
 3InBlock.gif              Private static Singleton instance;
 4ExpandedSubBlockStart.gifContractedSubBlock.gif              Private Singleton()dot.gif{}
 5InBlock.gif
 6InBlock.gif              Public static Singleton Instance
 7ExpandedSubBlockStart.gifContractedSubBlock.gif              dot.gif{
 8InBlock.gif                     Get
 9ExpandedSubBlockStart.gifContractedSubBlock.gif                     dot.gif{
10InBlock.gif                            If(instance==null)
11ExpandedSubBlockStart.gifContractedSubBlock.gif                            dot.gif{
12InBlock.gif                                   Instance=new Singleton();
13InBlock.gif
14ExpandedSubBlockEnd.gif                            }

15InBlock.gif
16InBlock.gif                            Return instance;
17InBlock.gif
18ExpandedSubBlockEnd.gif                     }

19ExpandedSubBlockEnd.gif              }

20ExpandedBlockEnd.gif       }

21 None.gif
22 None.gif class  Test
23 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
24InBlock.gifpublic static void Main()
25InBlock.gif
26ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
27InBlock.gif
28InBlock.gifSingleton t1=Singleton.Instance;
29InBlock.gif
30InBlock.gifSingleton t2=Singleton.Instance;
31InBlock.gif
32ExpandedSubBlockEnd.gif}

33InBlock.gif
34ExpandedBlockEnd.gif}

35 None.gif
36 None.gif

 

Exceptions 和 Singleton:

       以上的方式需要每次都来检查Instance是否为空,我们可以创建自己的Exception类来捕捉Instance不为空时的操作。

      

 1 None.gif   public   class  SingletionException:Exception
 2 None.gif
 3 ExpandedBlockStart.gifContractedBlock.gif        dot.gif {
 4InBlock.gif
 5InBlock.gif              Public SingletonException(string s):base(s)
 6InBlock.gif
 7ExpandedSubBlockStart.gifContractedSubBlock.gif              dot.gif{
 8InBlock.gif
 9ExpandedSubBlockEnd.gif              }

10InBlock.gif
11ExpandedBlockEnd.gif       }

12 None.gif
13 None.gif

Instance不为NULL时抛出异常

None.gif public   class  Singleton
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif       
private static bool flag_Instance=false;
InBlock.gif
InBlock.gif       
private Singleton()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif       
dot.gif{
InBlock.gif
ExpandedSubBlockEnd.gif       }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif       
public static GetSingleton()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif       
dot.gif{
InBlock.gif
InBlock.gif              
if(flag_Instance)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                     
throw new SingletonException("Only one Instance allowed");
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif              
else
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                     flag_Instance
=true;
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
ExpandedSubBlockEnd.gif       }

InBlock.gif
ExpandedBlockEnd.gif}
;
None.gif
None.gif

 

单线程Singleton模式的几个要点:

1.  Singleton模式中的实例构造器可以设置为Protected以允许子类派生。

2.  Singleton模式一般不要支持IConeable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。

3.  Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。

4.  Singleton模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾挥手的平台和对象的开销来讲,我们一般没有必要对其进行特殊的管理。

5.  不能应对多线程环境,在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象

 

多线程Singletion模式:

1.使用double-check来完成

 1 None.gif class  Singleton
 2 None.gif
 3 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 4InBlock.gif
 5InBlock.gif       private static volatile Singleton instance=null;//volatile在编译是不进行微调
 6InBlock.gif
 7InBlock.gif       private static object lockHelper=new Object();
 8InBlock.gif
 9InBlock.gif 
10InBlock.gif
11InBlock.gif       private Singleton()//私有构造器,使得Singleton 只可以在本类的内部被创建
12InBlock.gif
13ExpandedSubBlockStart.gifContractedSubBlock.gif       dot.gif{
14InBlock.gif
15ExpandedSubBlockEnd.gif       }

16InBlock.gif
17InBlock.gif 
18InBlock.gif
19InBlock.gif       public static Singleton Instance
20InBlock.gif
21ExpandedSubBlockStart.gifContractedSubBlock.gif       dot.gif{
22InBlock.gif
23InBlock.gif              get
24InBlock.gif
25ExpandedSubBlockStart.gifContractedSubBlock.gif              dot.gif{
26InBlock.gif
27InBlock.gif                     if(instance==null)
28InBlock.gif
29ExpandedSubBlockStart.gifContractedSubBlock.gif                     dot.gif{
30InBlock.gif
31InBlock.gif                            lock(lockHelper)
32InBlock.gif
33ExpandedSubBlockStart.gifContractedSubBlock.gif                            dot.gif{
34InBlock.gif
35InBlock.gif                                   if(instance==null)//避免了两个线程产生两个实例的危险
36InBlock.gif
37ExpandedSubBlockStart.gifContractedSubBlock.gif                                   dot.gif{
38InBlock.gif
39InBlock.gif                                          instance=new Singleton();
40InBlock.gif
41ExpandedSubBlockEnd.gif                                   }

42InBlock.gif
43ExpandedSubBlockEnd.gif                            }

44InBlock.gif
45ExpandedSubBlockEnd.gif                     }

46InBlock.gif
47InBlock.gif 
48InBlock.gif
49InBlock.gif                     return instance;
50InBlock.gif
51ExpandedSubBlockEnd.gif              }

52InBlock.gif
53ExpandedSubBlockEnd.gif       }

54InBlock.gif
55ExpandedBlockEnd.gif}
;
56 None.gif
57 None.gif

2.多线程Singleton Pattern的一种更好的方式:

 1 None.gif class  Singleton
 2 None.gif
 3 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 4InBlock.gif
 5InBlock.gif       public static readonly Singleton Instance=new Singleton();
 6InBlock.gif
 7InBlock.gif       private Singleton()
 8InBlock.gif
 9ExpandedSubBlockStart.gifContractedSubBlock.gif       dot.gif{
10InBlock.gif
11ExpandedSubBlockEnd.gif       }

12InBlock.gif
13ExpandedBlockEnd.gif}
;
14 None.gif
15 None.gif

 

3.上述代码等同于:

 1 None.gif class  Singleton
 2 None.gif
 3 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 4InBlock.gif
 5InBlock.gif       public static readonly Singleton Instance;
 6InBlock.gif
 7InBlock.gif 
 8InBlock.gif
 9InBlock.gif       static Singleton()
10InBlock.gif
11ExpandedSubBlockStart.gifContractedSubBlock.gif       dot.gif{
12InBlock.gif
13InBlock.gif              Instance =new Singleton();
14InBlock.gif
15ExpandedSubBlockEnd.gif       }

16InBlock.gif
17InBlock.gif 
18InBlock.gif
19InBlock.gif       private Singleton()
20InBlock.gif
21ExpandedSubBlockStart.gifContractedSubBlock.gif       dot.gif{
22InBlock.gif
23ExpandedSubBlockEnd.gif       }

24InBlock.gif
25ExpandedBlockEnd.gif}
;
26 None.gif
27 None.gif

 

 

Singleton模式扩展:

1.  将一个实例扩展到N个实例,例如对象池的实现。(N是固定的)。

2.  将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。

3.  理解和扩展SINGLETON模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用“。

转载于:https://www.cnblogs.com/leib_0474/archive/2005/10/25/261954.html

相关文章:

  • 5/6月学习工作总结(压力越大,意志越坚定)
  • Oracle临时表(Temporary Table)
  • 模块化开发
  • MVVM框架下,WPF实现Datagrid里的全选和选择
  • nodjs html 转 pdf
  • 动态创建HTML内容
  • 保存对象的不同状态值
  • Linux练习(write写入)
  • matlab练习程序(随机游走图像)
  • 远程桌面连接记录彻底清除
  • Android中使用WebView, WebChromeClient和WebViewClient加载网页
  • 多态的好处和弊端以及多态的理解
  • 要乐观对待生活
  • web计算器
  • iptables的配置文件/etc/sysconfig/iptables不存在怎么办
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Android Volley源码解析
  • Android系统模拟器绘制实现概述
  • canvas 五子棋游戏
  • ComponentOne 2017 V2版本正式发布
  • Git初体验
  • iOS | NSProxy
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JS+CSS实现数字滚动
  • vuex 笔记整理
  • vue数据传递--我有特殊的实现技巧
  • 阿里云Kubernetes容器服务上体验Knative
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 多线程 start 和 run 方法到底有什么区别?
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (C#)获取字符编码的类
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .md即markdown文件的基本常用编写语法
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • @AliasFor注解
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • @Transaction注解失效的几种场景(附有示例代码)
  • []FET-430SIM508 研究日志 11.3.31
  • [《百万宝贝》观后]To be or not to be?
  • [Angular 基础] - 指令(directives)
  • [Bada开发]初步入口函数介绍
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [ISITDTU 2019]EasyPHP
  • [javaSE] 看知乎学习工厂模式
  • [LeetCode]—Anagrams 回文构词法