c\#디자인 모델 의 단일 예 모델 의 실현 방식

장면 묘사
단일 모드 는 우리 에 게 조금도 모드 적 이지 않 고 흔히 볼 수 있 는 이름 입 니 다.단일 모드 가 프로그램 에서 의 실제 효 과 는 한 프로그램 에서 하나의 인 스 턴 스 만 확보 하고 전체 방문 점 을 제공 하여 시스템 자원 을 절약 하 는 것 입 니 다.
단일 모드 는 실제 개발 에서 나 소프트웨어 응용 에서 흔히 볼 수 있 습 니 다.예 를 들 어 windows 시스템 의 작업 관리자,IIS 의 HttpApplication,실제 프로젝트 의 로그 구성 요소 등 입 니 다.
실현 방식
단일 모드 에서 하나의 인 스 턴 스 를 실현 하기 위해 서 는 인 스 턴 스 를 만 들 지 않 고 클래스 자체 로 만 인 스 턴 스 를 만 들 수 있 습 니 다.효 과 를 실현 하기 위해 서 는 개인 구조 함 수 를 정의 해 야 합 니 다.
단일 모델 의 실현 방식 은 굶 주 린 사람 식,게 으 른 사람 식,이중 검증 식,정태 내부 류 가 있다.
다음은 각 실현 방식 에 대해 간단 한 실례 를 만 들 고 그 장단 점 을 살 펴 보 자.
굶 주 린 사람 식

/// <summary>
 ///      Singleton  (   )
 ///         ,         。
 ///  :    ,       。
 ///  :        ,    。
 ///    classloder              ,  ,instance          ,
 ///              ,              getInstance   ,
 ///             (         )     ,       instance        lazy loading    。
 /// </summary>
 public class SingleObject
 {
  //   SingleObject      
  private static SingleObject instance = new SingleObject();

  //       private,           
  private SingleObject() {
   Console.WriteLine("     .   ");
  }

  //         
  public static SingleObject GetInstance()
  {
   return instance;
  }

  public void ShowMessage()
  {
   Console.WriteLine("Hello World.   ");
  }
 }
게으름뱅이 식

/// <summary>
 ///      Singleton  (   )
 ///           lazy loading,            ,  ,    ,99%         。
 ///   :         ,      。
 ///   :             ,                       ,              。
 /// </summary>
 public class SingleObject1
 {
  //   SingleObject      
  private static SingleObject1 instance;

  //       private,           
  private SingleObject1() { }

  //         
  public static SingleObject1 GetInstance()
  {
   if (instance == null)
   {
    instance = new SingleObject1();
    Console.WriteLine("     .   ");
   }
   return instance;
  }

  public void ShowMessage()
  {
   Console.WriteLine("Hello World.   ");
  }
 }
이중 검증 식

/// <summary>
 ///      Singleton  (    )
 ///           lazy loading,            ,  ,    ,99%         。
 ///   :         ,      ,    。
 ///   :     synchronized       ,        。
 /// </summary>
 public class SingleObject2
 {
  //   SingleObject      
  private static SingleObject2 instance;

  //             
  private static readonly object locker = new object();


  //       private,           
  private SingleObject2() { }

  //         
  public static SingleObject2 GetInstance()
  {
   ////     ,     ,    
   if (instance == null)
   {
    lock (locker)
    {
     ////      ,        ,                    
     if (instance == null)
     {
      instance = new SingleObject2();
      Console.WriteLine("     .    ");
     }
    }
   }
   return instance;
  }

  public void ShowMessage()
  {
   Console.WriteLine("Hello World.    ");
  }
 }
정적 내부 클래스

/// <summary>
 ///      Singleton  (     ) 
 ///         ,               
 ///                    ,                  
 /// </summary>
 public class SingletonStatic
 {
  /// <summary>
  ///    
  /// </summary>
  public class SingletonStaticInner
  {
   /// <summary>
   ///             ,           beforefieldinit  
   ///                 ,             
   /// </summary>
   static SingletonStaticInner() { }

   /// <summary>
   ///    
   /// </summary>
   internal static SingletonStatic singletonStatic = new SingletonStatic();
  }

  /// <summary>
  ///       
  /// </summary>
  private SingletonStatic() {
   Console.WriteLine("     .     ");
  }

  /// <summary>
  ///     
  /// </summary>
  /// <returns></returns>
  public static SingletonStatic GetInstance()
  {
   return SingletonStaticInner.singletonStatic;
  }

  public void ShowMessage()
  {
   Console.WriteLine("Hello World.     ");
  }
 }
모든 생 성 방식 테스트
콘 솔 프로그램 을 만 들 고 다 중 스 레 드 를 통 해 모든 실현 방식 을 사용 하 며 인 스 턴 스 횟수 분석 을 봅 니 다.

/*
   
  :           ,              。
    :                。
    :         ,         。
    :             ,      ,       。
    :        。
    :
       :
1、windows       
2、IIS HttpApplication,   HttpModule     HttpApplication  
           :
1、    
2、        
3、     
4、      
  */
 
class Program
 {
  static void Main(string[] args)
  {
   TaskFactory taskFactory = new TaskFactory();
   List<Task> taskList = new List<Task>();

   ////   --    
   for (int i = 0; i < 5; i++)
   {
    taskList.Add(taskFactory.StartNew(() =>
    {
     SingleObject.GetInstance();
    }));
   }

   ////   --    
   for (int i = 0; i < 5; i++)
   {
    taskList.Add(taskFactory.StartNew(() =>
    {
     SingleObject1.GetInstance();
    }));
   }

   ////   --     
   for (int i = 0; i < 5; i++)
   {
    taskList.Add(taskFactory.StartNew(() =>
    {
     SingleObject2.GetInstance();
    }));
   }

   ////   --      
   for (int i = 0; i < 5; i++)
   {
    taskList.Add(taskFactory.StartNew(() =>
    {
     SingletonStatic.GetInstance();
    }));
   }

   Console.ReadLine();
  }
 }
실행 결과:
  
결 과 를 통 해 알 수 있 듯 이 게으름뱅이 식 은 실제 적 으로 두 개의 인 스 턴 스 를 만 들 었 기 때문에 다 중 스 레 드 에서 게으름뱅이 식 은 스 레 드 가 안전 하지 않 은 문제 가 있다.
총결산
단일 사례 모델 에 따라 모든 실현 방식 을 비교 분석 하고 실제 사용 과정 에서:
단일 스 레 드 응용 환경 이 라면 게으름뱅이 모델 을 사용 하 는 것 을 권장 합 니 다.
다 중 스 레 드 응용 환경 이 라면 정적 내부 클래스 를 사용 하 는 것 을 권장 합 니 다.
자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기