zoukankan      html  css  js  c++  java
  • 设计模式——单例模式

      单例模式——保证一个类仅有一个实例,并提供一个访问它的全局访问点

      单例模式是为了解决全局只允许存在一个实例,防止出现多个实例扰乱程序的正常的运行,单例模式不是一个时刻都需要运用的模式,是情非得已下才使用的

      它在多线程的条件下使用时必须要加锁才行,这样就造成了两种实现方式,分为“饿汉式”和“懒汉式”。

      “饿汉式”单例的实现,饿汉式的实现方式在于静态初始化时就自己实例化了自己,不需要外部进行初始化,提前占用资源。、

    1.创建一个单例类,定义为sealed不可继承,并且在初始化的时候就自己创建了一个实例,外部调用时将这个实例返回回去。

     1 /// <summary>
     2 /// 定义这个类不可继承
     3 /// </summary>
     4 public sealed class Singleton
     5 {
     6     //定义一个静态实例,当初始化时就将自己实例化
     7     //readonly该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中
     8     private static readonly Singleton Instance=new Singleton();
     9 
    10     /// <summary>
    11     /// 改造该类的构造方法
    12     /// 不允许外部实例化
    13     /// </summary>
    14     private Singleton()
    15     {
    16     }
    17 
    18     /// <summary>
    19     /// 给外部一个实例化对象的方法
    20     /// 当对象存在时,直接返回对象
    21     /// </summary>
    22     /// <returns></returns>
    23     public static Singleton GetInstance()
    24     {
    25         return Instance;
    26     }
    27 }
    Singleton.cs

      “懒汉式单例”时自己不创建自己的实例,当第一个给外部调用的时候才创建实例,以后再次调用的时候,判断是否为Null,不为null就返回前面创建的实例,当然,为了解决多线程并发的问题,创建时需要加锁。

    2.创建一个单例,定义一个实例,并创建一个锁,提供给外部一个获得实例的方法,方法里面进行非空验证,为空则加锁创建实例。

     1 public class Singleton
     2 {
     3     /// <summary>
     4     /// 定义一个静态实例
     5     /// </summary>
     6     private static Singleton _instance;
     7 
     8     /// <summary>
     9     /// 创建一个锁
    10     /// </summary>
    11     private static readonly object SyncRoot=new object();
    12 
    13     /// <summary>
    14     /// 将构造方法改为私有的,不允许外部调用并且实现new
    15     /// </summary>
    16     private Singleton(){}
    17 
    18     /// <summary>
    19     /// 提供一个给外部获得实例的方法
    20     /// </summary>
    21     /// <returns></returns>
    22     public static Singleton GetInstance()
    23     {
    24         //判断是否为null
    25         if (_instance==null)
    26         {
    27             //加锁创建实例
    28             lock (SyncRoot)
    29             {
    30                 //再进行一次非空判断是防止两个进程同时通过了非null判断
    31                 //另一个在排队,就会造成再一次创建实例
    32                 if (_instance==null)
    33                 {
    34                      _instance=new Singleton();
    35                 }
    36             }
    37         }
    38         return _instance;
    39     }
    40 }
    Singleton.cs

                                                              以上内容部分参考程杰的《大话设计模式》一书

      

  • 相关阅读:
    JSON.stringify深拷贝的缺点
    Vue生命周期和详细的执行过程
    CSS中width:100%和width:auto的区别
    react中的setState的使用和深入理解
    一文看懂Chrome浏览器运行机制
    闭包和垃圾回收机制
    linux 下的文件下载和上传
    mvn install本地安装jar到指定仓库
    内网maven依赖仓库jar报错解决
    hbase源码编译调试
  • 原文地址:https://www.cnblogs.com/Smilodon/p/3107250.html
Copyright © 2011-2022 走看看