单例模式

单例模式(Singleton):

  保证一个类仅有一个实例,并提供一个访问它的全局访问点。

 

一、UML结构图

 

 

二、示例代码【重点

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 namespace 单例模式
  7 {
  8     class Program
  9     {
 10         static void Main(string[] args)
 11         {
 12             SingleModelOne.GetInstance().Show();
 13             SingleModelTwo.GetInstance().Show();
 14             SingleModelThree.GetInstance().Show();
 15 
 16             Console.Read();
 17         }
 18     }
 19 
 20     /// <summary>
 21     /// 单线程单例模式(懒汉式单例)
 22     /// </summary>
 23     public class SingleModelOne
 24     {
 25         private static SingleModelOne m_SingleModeOne = null;        
 26 
 27         /// <summary>
 28         /// 单例模式的构造函数一定要【私有化】
 29         /// </summary>
 30         private SingleModelOne() { }
 31 
 32         public static SingleModelOne GetInstance()
 33         {
 34             if (m_SingleModeOne == null)
 35                 m_SingleModeOne = new SingleModelOne();
 36 
 37             return m_SingleModeOne;
 38         }
 39         public void Show()
 40         {
 41             Console.WriteLine("1、我是懒汉式、单线程单例模式");
 42         }
 43     }
 44 
 45     /// <summary>
 46     /// 多线程单例模式(懒汉式单例)
 47     /// </summary>
 48     public class SingleModelTwo
 49     {
 50         private static SingleModelTwo m_SingleModeTwo = null;
 51         private static object m_LockObj = new object();
 52 
 53         /// <summary>
 54         /// 单例模式的构造函数一定要【私有化】
 55         /// </summary>
 56         private SingleModelTwo() { }
 57 
 58         public static SingleModelTwo GetInstance()
 59         {
 60             //双重加锁 一 :是为了防止线程阻塞,若对象已创建,此时在lock内部判断,就会导致其它线程在lock外等待。
 61             if (m_SingleModeTwo == null)
 62             {
 63                 lock (m_LockObj)
 64                 {
 65                     if (m_SingleModeTwo == null)
 66                         m_SingleModeTwo = new SingleModelTwo();
 67                 }
 68             }
 69             return m_SingleModeTwo;
 70         }
 71         public void Show()
 72         {
 73             Console.WriteLine("2、我是懒汉式、多线程单例模式");
 74         }
 75     }
 76 
 77     /// <summary>
 78     /// 单线程单例模式(饿汉式单例)
 79     /// 饿汉式:【sealed】防止类被派生,派生就可能会增加实例。
 80     ///        【readonly】对象只读,交由OCL负责初始化变量
 81     /// </summary>
 82     public sealed class SingleModelThree
 83     {
 84         //首先将对象初始化完毕
 85         private readonly static SingleModelThree m_SingleModelThree = new SingleModelThree();        
 86 
 87         /// <summary>
 88         /// 单例模式的构造函数一定要【私有化】
 89         /// </summary>
 90         private SingleModelThree() { }
 91 
 92         public static SingleModelThree GetInstance()
 93         {           
 94             return m_SingleModelThree;
 95         }
 96         public void Show()
 97         {
 98             Console.WriteLine("3、我是饿汉式、单线程单例模式");
 99         }
100     }
101 
102 }
三类单例使用场景

 

posted @ 2019-12-03 09:16  秋飘  阅读(124)  评论(0编辑  收藏  举报