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

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

常用的几种实现方式:

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

 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、饿汉模式

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

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

 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、懒汉模式

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

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

 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         }

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

转载于:https://www.cnblogs.com/yaolin1228/p/7733970.html

设计模式 (3) : 单例模式的几种方法相关推荐

  1. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton {private static Singleton ...

  2. python编程入门单例_常见的在Python中实现单例模式的三种方法

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在 ...

  3. python实现单例模式的三种方法

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 其目 ...

  4. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

  5. Java面试23种设计模式之单例模式的8种实现方式

    单例模式8中实现方式 1.单例模式介绍 2.单例模式的八种方式 3.饿汉式(静态常量),这种单例模式可用,可能造成内存浪费. 4.饿汉式(静态代码块),这种单例模式可用,可能造成内存浪费. 5.懒汉式 ...

  6. Java23种设计模式之单例模式的五种实现方式、反射破解单例模式、不能破解枚举单例模式详解

    源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23 ...

  7. Python创建单例模式的5种方法

    单例模式(Singleton Pattern)是一种常用的软件设计模式,是指一个类的实例从始至终只能被创建一次,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例:为了 ...

  8. 《23种设计模式之单例模式(4种实现)》

    说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...

  9. Java 实现单例模式的 9 种方法

    一. 什么是单例模式 因进程需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 单例模式只能有一个实例. 单例类必须创建自己的唯一实 ...

最新文章

  1. TI Davinci DM6446 开发攻略(序)
  2. c语言变量为什么要定义,C语言为什么要规定对所用到的变量要“先定义,后使用”...
  3. Java工程师必备技能
  4. Camera摄像头工作原理
  5. Ansible 安装
  6. java abs在哪个包,Java StrictMath abs()方法
  7. scala中class,object,trait的区别
  8. 计算机网络与通信pdf谢希仁_考情分析|2020年同济大学计算机考研考情分析
  9. c++基础(上) 听课流水账
  10. 孔子做人精要,看完启发很多
  11. 热电传感器(1)——原理和定律
  12. css文字不换行显示、超出显示点点点等实用性小记
  13. Region Proposal by Guided Anchoring 阅读笔记
  14. 安卓手机管理_七色米ERP(七色米ERP进销存管理)V1.2.1 安卓手机版
  15. Python的生成器函数
  16. .DOT COMMON-斯科特·汉塞尔曼(Scott Hanselman)的一首节拍诗
  17. ftl模板导出excel_freemarker导出定制excel
  18. mysql 海明距离_mysql根据经纬度求两地距离(示例代码)
  19. 书法在平面设计中有哪些作用
  20. Android上的Mosquitto推送

热门文章

  1. spring4声明式事务--01注解方式
  2. Hadoop1.2.1伪分布模式安装指南
  3. 史上最详细最容易理解的HMM文章
  4. Java语言学习思维导图
  5. linux shell中21的含义
  6. C语言关于static的解析
  7. 《深入理解计算机系统》读书笔记一
  8. 汇编:JCXZ条件转移指令
  9. SpringBoot-hello world
  10. Snapchat何以在Facebook包围下“杀出重围”?