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

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

      

  • 相关阅读:
    ReactNative问题随记1 Exception in thread "main" java.lang.RuntimeException: gradle-2.14.1-all.zip
    Win10 安装 VMWare中 MAC OS X的安装,VMWare tools的配置与iOS的Helloworld
    JavaScript 异步编程的前世今生(上)
    老司机带路:《axios从入门到开车 嘀嘀~~》
    如何在微信小程序定义全局变量、全局函数、如何实现 函数复用 模块化开发等问题详解
    详解AMD规范及具体实现requireJS在工程中的使用
    如何让浏览器支持ES6语法,步骤详细到小学生都能看懂!
    对JS闭包和函数作用域的问题的深入讨论,如何理解JS闭包和函数作用域链?
    混合物App开发中,在移动设备上调试查看日志,重写window.console
    HTML5调用手机摄像机、相册功能 <input>方法
  • 原文地址:https://www.cnblogs.com/Smilodon/p/3107250.html
Copyright © 2011-2022 走看看