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 李建忠的讲座。

  • 相关阅读:
    angular js模块,angular js控制器
    select ipnut双向数据绑定用法
    ng-repeat循环遍历的用法
    angular js起步
    文件上传(预览2 老师提供的方法)
    设置mui头部(头部与最上面可以设置同样的样子)支持ios (苹果) 安卓不支持
    点击按钮btn 打开(跳转)新的页面
    定位精准 并打印出来
    把原始坐标转化为百度坐标(位置更精确)
    原始地理定位
  • 原文地址:https://www.cnblogs.com/tian2010/p/2033405.html
Copyright © 2011-2022 走看看