zoukankan      html  css  js  c++  java
  • C#设计模式--单例模式

    0.C#设计模式-简单工厂模式

    1.C#设计模式--工厂方法模式

    2.C#设计模式--抽象工厂模式

    设计模式:

    单例模式(Singleton Pattern)

    单例模式简单介绍

    单例模式的特点:

    • 单例类只能有一个实例。
    • 单例类必须自己创建自己的唯一实例。
    • 单例类必须给所有其它对象提供这一实例。

    单例模式类图:

     

    单例模式c#代码举例,分别用三种常见的单例模式举例

    单例模式1 线程不安全

    在多线程的环境下有可能得到Singleton类的多个实例

     1     /// <summary>
     2     /// 单例模式1,线程不安全
     3     /// </summary>
     4     public class Singleton
     5     {
     6         private static Singleton _instance = null;
     7 
     8         /// <summary>
     9         /// 构造方法私有,防止实例化
    10         /// </summary>
    11         private Singleton() { }
    12         public static Singleton Instance
    13         {
    14             get 
    15             { 
    16                 return _instance ?? (_instance = new Singleton()); //??表示,如果_instance为null 则执行后面括号中的
    17             }
    18         }
    19     }

    单例模式2 线程安全

    需要创建了一个静态只读的进程辅助对象_instanceLock ,由于lock是确保当一个线程位于代码的临界区时,另一个线程不能进入临界区(同步操作)。如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放。从而确保在多线程下不会创建多个对象实例了。只是这种实现方式要进行同步操作,这将是影响系统性能的瓶颈和增加了额外的开销(只是针对系本身开销比较大的情况,一般情况下,这样是可以的,如果说对系统性能要求极高,最好采用第三种方式)

     1    /// <summary>
     2     /// 单例模式2,线程安全
     3     /// </summary>
     4     public class Singleton
     5     {
     6         private static Singleton _instance = null;
     7         private static readonly object _instanceLock = new object();
     8         private Singleton() { }
     9         public static Singleton Instance
    10         {
    11             get
    12             {
    13                 lock (_instanceLock)
    14                 {
    15                     return _instance ?? (_instance = new Singleton());
    16                 }
    17             }
    18         }
    19     }

    单例模式3:线程安全(建议用这种方式)

    在同步操作之前,添加判断该实例_instance是否为null就可以降低通过操作的次数了,提高系统的性能

     1     /// <summary>
     2     /// 单例模式3:线程安全(建议用这种方式)
     3     /// </summary>
     4     public class Singleton
     5     {
     6         private static Singleton _instance = null;
     7         private static readonly object _instanceLock = new object();
     8         private Singleton() { }
     9         public static Singleton Instance
    10         {
    11             get
    12             {
    13                 if (null == _instance)
    14                 {
    15                     lock (_instanceLock)
    16                     {
    17                         if (null == _instance)
    18                         {
    19                             _instance = new Singleton();
    20                         }
    21                     }
    22                 }
    23                 return _instance;
    24             }
    25         }
    26     }

    单例模式测试代码:

     1  class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Singleton singleton1 = Singleton.Instance;
     6             Singleton singleton2 = Singleton.Instance;
     7            
     8             if (singleton1 == singleton2)
     9             {
    10                 Console.WriteLine("ok");
    11             }
    12             else
    13             {
    14                 Console.WriteLine("no");
    15             }
    16             Console.Read();
    17         }
    18     }

    运行结果

    源代码工程文件下载

  • 相关阅读:
    Java基本开发环境搭建(适合第一次使用)
    在oracle中通过链接服务器(dblink)访问sql server
    C# 鼠标悬停在datagridview的某单元格,显示悬浮框效果
    经典SQL语句大全
    程序员为何要写技术博客?
    收缩SQL数据库日志
    利用脚本设置本机IP地址
    在SQL Server 2005中连接Oracle,完成查询、插入操作
    Centos 7 下 Corosync + Pacemaker + psc + HA-proxy 实现业务高可用
    Centos 7 下 Corosync + Pacemaker + psc 实现 httpd 服务高可用
  • 原文地址:https://www.cnblogs.com/JiYF/p/6417766.html
Copyright © 2011-2022 走看看