zoukankan      html  css  js  c++  java
  • 设计模式之Singleton模式(1)

    Singleton模式及单例/单件模式。

    类型:创建型模式

    Gof定义:保证一个类仅有一个实例,并提供一个该实例全局的访问点。

    我们来看集中Singleton模式的例子:

    单线程Sinleton
    1 /// <summary>
    2 /// Single thread Singleton pattern
    3 /// </summary>
    4   public class Singleton
    5 {
    6 private static Singleton instance;
    7
    8 public static Singleton Instance
    9 {
    10 get
    11 {
    12 if (instance == null)
    13 {
    14 instance = new Singleton();
    15 }
    16 return instance;
    17 }
    18 }
    19
    20 private Singleton() { }
    21 }

    上面的例子在多线程中就会破坏Singleton的原则,及一个类仅有一个实例。

    假设有两个线程Thread1和Thread2,Thread1判断instance为null,进入if语句,此时,在new出Singleton实例前,

    Thread2也走到了if语句,同样判断instance为null,这样,两个线程分别创建一个Singleton实例,从而破坏了Sinleton的原则。

    多线程Singleton
    1 /// <summary>
    2 /// Multi thread Singleton pattern
    3 /// </summary>
    4   public class Singleton
    5 {
    6 private static volatile Singleton instance = null;
    7 private static object lockHelper = new object();
    8
    9 public static Singleton Instance
    10 {
    11 get
    12 {
    13 if (instance == null)
    14 {
    15 lock (lockHelper)
    16 {
    17 if (instance == null)
    18 {
    19 instance = new Singleton();
    20 }
    21 }
    22 }
    23 return instance;
    24 }
    25 }
    26
    27 private Singleton() { }
    28 }

    精简方式
    1 /// <summary>
    2 /// Multi thread Singleton pattern
    3 /// </summary>
    4 class Singleton
    5 {
    6 public static readonly Singleton Instance = new Singleton();
    7 private Singleton() { }
    8 }

    等同于以下方式

    精简方式还原
    1 /// <summary>
    2 /// Multi thread Singleton pattern
    3 /// </summary>
    4 class Singleton
    5 {
    6 public static readonly Singleton Instance;
    7
    8 static Singleton ()
    9 {
    10 Instance = new Singleton();
    11 }
    12 private Singleton() { }
    13 }

    如何验证Singleton模式

    验证Singleton
    1 private bool VerifySingletonPattern()
    2 {
    3 Singleton s1 = Singleton.Instance;
    4 Singleton s2 = Singleton.Instance;
    5
    6 return object.ReferenceEquals(s1, s2);
    7 }

    注:本系列博客来自WebCasts 李建忠的讲座。

  • 相关阅读:
    Stm32CubeMX5 配置 STM32的串口DMA接受方式 --- 基于 stm32f051k8u6
    Stm32 控制1.44寸液晶显示图片 基于stm32f051k8u6
    makefile自动编译
    Stm32CubeMX5 创建LED控制工程
    ARM 汇编与C之间 的调用
    shell 脚本文件类型.sh ,变量
    bzoj3589 动态树 求链并 容斥
    bzoj2287【POJ Challenge】消失之物 缺一01背包
    bzoj2916: [Poi1997]Monochromatic Triangles 思路
    [NOI2010]超级钢琴 主席树
  • 原文地址:https://www.cnblogs.com/tian2010/p/2033405.html
Copyright © 2011-2022 走看看