前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式 (3) : 单例模式的几种方法

设计模式 (3) : 单例模式的几种方法

作者头像
用户2434869
发布2018-09-12 10:31:32
3840
发布2018-09-12 10:31:32
举报
文章被收录于专栏:yl 成长笔记yl 成长笔记

定义: 确保一个类只有一个实例, 并提供一个全局访问点。

原理: c# 中用 new 方法创建一个实例需要调用类的构造函数(注: 每一个类都必须有至少一个构造函数, 当我们未定义构造函数时,编译时编译器会帮我们生成一个公有的无参数的构造函数。), 当构造函数私有(private) 时,在类外部无法创建创建类的实例。

常用的几种实现方式:

1、只可在单线程下使用的实现

代码语言:javascript
复制
 1 // 最简单的单线程下的单例模式   
 2    public class Singleton
 3    {
 4        // 局部静态变量记录 Singleton 类的唯一实例
 5        private  static Singleton uniqueInstance;
 6         // 私有构造器,只有 Singleton 类内部才可调用构造器(创建实例)
 7         private Singleton() { }
 8 
 9         // 全局调用的静态方法
10         public static Singleton getInstance()
11         {
12             if (uniqueInstance == null)
13             {
14                 uniqueInstance = new Singleton();
15             }
16 
17             return uniqueInstance;
18         }
19     }

2、饿汉模式

顾名思义, 一个人特别饿,一听到说有东西吃,马上将开始吃东西(加载类时就完成初始化)。

在加载时实例化,无需考虑多线程问题。优点是线程安全且不用锁,缺点是资源利用效率低。

代码语言:javascript
复制
 1    // sealed : 使类无法被继承
 2     public sealed class Singleton
 3     {
 4         // static  在静态初始化器(sttic initializ)中创建单间, 保证了线程安全
 5         private static  Singleton uniqueInstance = new Singleton();
 6 
 7         private Singleton() { }
 8         // 提供全局接口
 9         public static Singleton getInstance()
10         {
11             return uniqueInstance;
12         }
13 
14     }

3、懒汉模式

同样顾名思义, 一个人特别懒,听到人喊吃饭(加载类),过来坐到饭桌前玩手机,非要等说开始吃饭才开吃(才实例化)。

延迟实例化, 需要通过 “双重检查加锁” 检查, 系统效率可以会低下。

代码语言:javascript
复制
 1    // sealed : 使类无法被继承
 2     public sealed class Singleton
 3     {
 4         // static  在静态初始化器(sttic initializ)中创建单间, 保证了线程安全
 5         private static  Singleton uniqueInstance = new Singleton();
 6 
 7         private Singleton() { }
 8 
 9         public static Singleton getInstance()
10         {
11             return uniqueInstance;
12         }
13 
14     }
15 
16  // 不用 .net 提供的 Lazy 方法, 实现方法如下所示
17     public sealed class Singleton
18     {
19         private static Singleton uniqueInstance;
20 
21         // 定一个标识,确保线程同步
22         private static readonly object locker = new object();
23 
24         private Singleton() { }
25 
26         public static Singleton getInstacne()
27         {
28             if (uniqueInstance == null)
29             {
30                 lock(locker)  // 加锁, 第二个的线程在此处挂起
31                 {
32                     if (uniqueInstance == null)
33                     {
34                         uniqueInstance = new Singleton();
35                     }
36                 } // 解锁, 第二个线程进入
37             }
38 
39             return uniqueInstance;
40         }

 以上是最近学习单例模式的总结, 如有不对,请指教!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档