文章标题

来源:互联网 发布:知乎网络小说推荐 编辑:程序博客网 时间:2024/06/18 12:10

一、定义
要点:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
具体实现:
1.单例模式的类只提供私有的构造函数
2.类定义中含有一个该类的静态私有对象
3.该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象
二、UML图
这里写图片描述
三、C#代码实例
客户端调用代码

<span style="font-family:KaiTi_GB2312;font-size:18px;">        static void Main(string[] args)          {              Singleton s1 = Singleton.GetInstance();              Singleton s2 = Singleton.GetInstance();              //比较两个实例化后对象的结果是相同实例              if (s1 == s2 )              {                  Console.WriteLine("两个对象是相同的实例");              }              Console.Read();          }</span> 

懒汉式

<span style="font-family:KaiTi_GB2312;font-size:18px;">    class Singleton      {            private static Singleton instance;          //构造方法让其Private,这就堵死了外界利用new创建此类实例的可能          private Singleton()          {          }          //此方法是获得本类实例的唯一全局访问点          public static Singleton GetInstance()          {              //若实例不存在,则new一个新实例,否则返回已有的实例              if (instance == null )              {                  instance = new Singleton();              }          }      }</span>  

饿汉式

<span style="font-family:KaiTi_GB2312;font-size:18px;">class Singleton  {      private static Singleton instance = new Singleton();      //构造方法让其Private,这就堵死了外界利用new创建此类实例的可能      private Singleton()      {      }      //此方法是获得本类实例的唯一全局访问点      public static Singleton GetInstance()      {          //上面已经实例化过了,所以这里直接返回就可以          return instance;      }  }</span>  

多线程

<span style="font-family:KaiTi_GB2312;font-size:18px;">class Singleton  {      private static Singleton instance;      //程序运行时创建一个静态只读的进程扶助对象      private static readonly object syncRoot = new object();      //构造方法让其Private,这就堵死了外界利用new创建此类实例的可能      private Singleton()      {      }      //此方法是获得本类实例的唯一全局访问点      public static Singleton GetInstance()      {          //在同一个时刻加了锁的那部分程序只有一个线程可以进入          lock (syncRoot)          {              //若实例不存在,则new一个新实例,否则返回已有的实例              if (instance == null)              {                  instance = new Singleton();              }          }          return instance;      }  }</span>  

双重锁

<span style="font-family:KaiTi_GB2312;font-size:18px;">    class Singleton      {          private static Singleton instance;          //程序运行时创建一个静态只读的进程扶助对象          private static readonly object syncRoot = new object();          //构造方法让其Private,这就堵死了外界利用new创建此类实例的可能          private Singleton()          {          }          //此方法是获得本类实例的唯一全局访问点          public static Singleton GetInstance()          {              //先判断实例是否存在,不存在再加锁处理              if (instance == null)              {                  //在同一个时刻加了锁的那部分程序只有一个线程可以进入                  lock (syncRoot)                  {                      //若实例不存在,则new一个新实例,否则返回已有的实例                      if (instance == null)                      {                          instance = new Singleton();                      }                  }              }              return instance;          }      }</span>  

五、单例优缺点
优点:实例控制(单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例)、灵活(因为类控制了实例化过程,所以类可以灵活更改实例化过程、并且很多地方都不需要再进行实例化)
缺点:可以单击此链接查看:滥用的单例模式有多少害处
六、感受
再次学习单例模式之后对于它的理解、运用更加深入了,在以后的编程路上需要适度运用单例模式。

0 0
原创粉丝点击