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

设计模式--Singleton_(1)(C#版)

今天我们来探索一下Singleton设计模式的实现及应用场景。

Singleton模式属于Creational Type(创建型)设计模式的一种。该模式一般用于确保在应用中仅创建一个某类的instance,在应用中的各个地方对该类的实例对象的引用均指向同一instacne。

Singleton模式的优势:它提供了对资源的concurrent(一致)访问,避免了创建多个实例对象,浪费内存空间。

Singleton模式实现准则:

1、确保仅有一个类的实例对象

2、提供对唯一实例对象的全局访问,该规则又可细分为3条规则。

  • 声明该类的所有构造器为private
  • 提供返回实例对象的引用的静态方法
  • 实例对象被存储为类的private static字段

下面通过例子实现Singleton模式,在具体实现时,我们首先实现不使用Singleton模式的代码,然后一步一步地将其改造成Singleton模式。

 1 namespace Singleton
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Singleton s1 = new Singleton();
 8             s1.PrintMessage("this is first message");
 9 
10             Singleton s2 = new Singleton();
11             s2.PrintMessage("this is second message");
12 
13             Console.ReadKey();
14         }
15     }
16     class Singleton
17     {
18         private static int counter = 0;
19         public Singleton()
20         {
21             counter++;
22             Console.WriteLine("这是第"+counter.ToString()+"次调用构造函数");
23         }
24         public void PrintMessage(String str)
25         {
26             Console.WriteLine(str);
27         }
28     }
29 }

运行结果如下图:

 

  可以看出,在不使用Singleton模式时,每次使用类Singleton的PrintMessage方法时,都需要创建一个新的实例对象,这造成了极大的浪费。下面我们按照上面所说的准则将它改造成使用Singleton模式。

 1 namespace Singleton
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Singleton s1 = Singleton.getInstance;
 8             s1.PrintMessage("this is first message");
 9 
10             Singleton s2 = Singleton.getInstance;
11             s2.PrintMessage("this is second message");
12 
13             Console.ReadKey();
14         }
15     }
16     public sealed class Singleton
17     {
18         private static int counter = 0;
19         private static Singleton instance=null;
20 
21         public static Singleton getInstance
22         {
23             get
24             {
25                 if (instance == null)
26                     instance = new Singleton();
27                 return instance;
28             }
29         }
30         private Singleton()
31         {
32             counter++;
33             Console.WriteLine("这是第"+counter.ToString()+"次调用构造函数");
34         }
35         public void PrintMessage(String str)
36         {
37             Console.WriteLine(str);
38         }
39     }
40 }

运行结果如下图:

 

  另外,需要注意的是,不要忘了在Singleton类的声明中添加sealed关键字,它确保了Singleton类不可被继承。当Singleton类可被继承且继承类位于Singleton基类外部时,由于Singleton基类的构造函数声明为private,此时运行程序会产生Singleton.Singleton()受保护级别限制不可访问的编译错误;当Singleton类可被继承且继承类位于Singleton基类内部构成嵌套类时,这时在main()方法中就可以创建多个继承类的instance,这就违背了Singleton模式的设计初衷:仅能创建该类型的一个instance。

  最后,上述代码仅在单线程环境中运行良好,在下篇中介绍多线程环境中的实现,及Double-checked locking和lazy initialization的相关概念。

转载于:https://www.cnblogs.com/lian--ying/p/9070866.html

相关文章:

  • 数据结构与算法-数组(Array)
  • Linux-01初级学习
  • Go语言中时间函数及定时器的使用
  • react——jsx源码解析
  • 拿Proxy可以做哪些有意思的事儿
  • centos7 安装 rabbitmq
  • 如何快速学习Java?
  • SylixOS write 0字节问题
  • 理解Android 中的启动模式
  • 深入理解jvm jdk1,7(5)
  • 学会python可以上天!20行代码获取斗鱼平台房间数据,就是这么牛逼!
  • Golang 多goroutine异步通知error的一种方法
  • 前端base64加密
  • 关于kettle,表输入postgres中有jsonb字段的处理
  • Mybatis架构设计及源码分析-mapper.xml文件解析
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • echarts的各种常用效果展示
  • iOS 颜色设置看我就够了
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript设计模式系列一:工厂模式
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • overflow: hidden IE7无效
  • PHP 小技巧
  • Python实现BT种子转化为磁力链接【实战】
  • React-flux杂记
  • sessionStorage和localStorage
  • Spark RDD学习: aggregate函数
  • SQL 难点解决:记录的引用
  • STAR法则
  • swift基础之_对象 实例方法 对象方法。
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 一个项目push到多个远程Git仓库
  • 《码出高效》学习笔记与书中错误记录
  • #Lua:Lua调用C++生成的DLL库
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (a /b)*c的值
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (七)c52学习之旅-中断
  • (十一)手动添加用户和文件的特殊权限
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .FileZilla的使用和主动模式被动模式介绍
  • .Net Core与存储过程(一)
  • @RequestBody与@ResponseBody的使用
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [AIGC] Spring Interceptor 拦截器详解
  • [BUAA软工]第一次博客作业---阅读《构建之法》