디자인 모델 의 단일 사례 모델 에 대한 소개 와 몇 가지 실현 방식

디자인 모델 의 단일 예 모델
 
단일 모드: 단일 대상 의 클래스 는 하나의 인 스 턴 스 만 존재 할 수 있 습 니 다.그것 의 핵심 구조 에는 단일 사례 라 고 불 리 는 특수 류 만 포함 되 어 있다.단일 모드 를 통 해 시스템 에서 이 모드 를 응용 하 는 클래스 는 하나의 인 스 턴 스 만 있 고 하나의 클래스 는 하나의 대상 인 스 턴 스 만 있 음 을 보증 할 수 있 습 니 다.
단일 모드 는 두 가지 구축 방식 이 있 습 니 다.
게으름뱅이 모드: 전역 의 단일 인 스 턴 스 가 처음 사용 되 었 을 때 구축 되 는 것 을 말 합 니 다.
굶 주 린 사람 방식: 전역 의 단일 인 스 턴 스 를 클래스 로 불 러 올 때 구축 하 는 것 을 말 합 니 다.
단일 모드 는 대상 을 되 돌려 주 는 인용 (영원히 같은 것) 과 이 인 스 턴 스 를 얻 는 방법 (정적 방법 이 어야 하 며 보통 getInstance 이름 을 사용 합 니 다) 을 요구 합 니 다.
단일 모델 의 실현 은 주로 다음 과 같은 두 가지 절 차 를 통 해 이 루어 진다.
  • 이러한 구조 방법 을 사유 방법 으로 정의 하면 다른 곳 의 코드 는 이러한 구조 방법 을 호출 하여 이러한 대상 을 예화 할 수 없고 이런 유형의 정적 방법 으로 만 이러한 유형의 유일한 인 스 턴 스 를 얻 을 수 있다.
  • 이 클래스 에서 정적 방법 을 제공 합 니 다. 이 방법 을 호출 할 때 클래스 가 가지 고 있 는 인용 이 비어 있 지 않 으 면 이 인용 을 되 돌려 줍 니 다. 클래스 가 비어 있 으 면 이러한 인 스 턴 스 를 만 들 고 인 스 턴 스 의 인용 을 유지 하 는 인용 에 부여 합 니 다.

  • 단일 모드 사용 필드:
     
    게으름뱅이 식 추천 용 몇 가지 방법:
  • 이중 검사:
  •     장점: 스 레 드 안전;로드 지연;효율 이 비교적 높다.
    Eg:
    /// 
    
        ///    (   )
    
        /// 
    
        class Singleton
    
        {
    
            #region Fields
    
            /// 
    
            ///             
    
            /// 
    
            private static Singleton m_uniqueinstance;
    
            /// 
    
            ///    
    
            /// 
    
            private static readonly object Locker = new object();
    
            #endregion
    
    
            #region Constructors
    
            /// 
    
            ///       
    
            /// 
    
            private Singleton()
    
            {
    
            }
    
            #endregion
    
    
            #region Public Methods
    
            /// 
    
            ///           (    )
    
            /// 
    
            /// 
    
            public static Singleton createInstance()
    
            {
    
                if (m_uniqueinstance == null)
    
                {
    
                    lock (Locker)
    
                    {
    
                        if (m_uniqueinstance == null)
    
                        {
    
                            m_uniqueinstance = new Singleton();
    
                            Console.WriteLine("        ");
    
                        }
    
                    }
    
                }
    
                else
    
                {
    
                    Console.WriteLine("  ,      ");
    
                }
    
                return m_uniqueinstance;
    
            }
    
        }
  • 내부 정적 클래스
  •      장점: 자원 이 용 률 이 높 지 않 고 Get Instance () 를 실행 하지 않 으 면 예화 되 지 않 고 다른 정적 방법 을 실행 할 수 있 습 니 다.
         단점: 처음 불 러 올 때 반응 이 빠 르 지 않 습 니 다.      
      /// 
    
        ///    (     )
    
        /// 
    
        public class SingletonStaticClass
    
        {
    
    
            #region Constructors
    
            private SingletonStaticClass()
    
            {
    
            }
    
            #endregion
    
    
            #region Public Methods
    
            public static SingletonStaticClass GetInstance()
    
            {
    
                return SingletonInstance.Instance;
    
            }
    
            #endregion
    
            /// 
    
            ///      
    
            /// 
    
            private static class SingletonInstance
    
            {
    
                public static SingletonStaticClass Instance = new SingletonStaticClass();
    
            }
    
    }
  • Lazy 지연 로드 사용
  •     
    /// 
    
        ///    (Lazy)
    
        /// 
    
        class Singleton2
    
        {
    
            #region Fields
    
           /// 
    
            /// lazy      
    
            /// 
    
            private static readonly Lazy lazy = new Lazy(() => new Singleton2());
    
            #endregion
    
    
            #region Constructors
    
            /// 
    
            ///       
    
            /// 
    
            private Singleton2()
    
            {
    
            }
    
            #endregion
    
    
            #region Properties
    
            /// 
    
            ///     
    
            /// 
    
            public static Singleton2 Instance
    
            {
    
                get { return lazy.Value; }
    
            }
    
            #endregion
    
    
        }
  • 정적 초기 화
  •      
    /// 
    
        ///       
    
        /// 
    
        public sealed class SingletonStatic
    
        {
    
            #region Fields
    
            /// 
    
            ///       
    
            /// 
    
            private static readonly SingletonStatic m_Instance = null;
    
            #endregion
    
    
            #region Constructors
    
            /// 
    
            ///       
    
            /// 
    
            static SingletonStatic()
    
            {
    
                m_Instance = new SingletonStatic();
    
            }
    
            /// 
    
            ///       
    
            /// 
    
            private SingletonStatic()
    
            {
    
            }
    
            #endregion
    
            #region Properties
    
            /// 
    
            ///     
    
            /// 
    
            public static SingletonStatic Instance
    
            {
    
                get
    
                {
    
                    return m_Instance;
    
                }
    
            }
    
            #endregion
    
      }

     
    굶 주 린 사람:
     장점: 1. 라인 안전
          2. 클래스 로 딩 과 동시에 정적 대상 을 만 들 었 습 니 다. 호출 은 반응 속도 가 빠 릅 니 다.
    단점: 자원 효율 이 높 지 않 습 니 다. GetInstance () 는 영원히 실행 되 지 않 을 수도 있 습 니 다. 그러나 이 종류의 다른 정적 방법 을 실행 하거나 이 종 류 를 불 러 오 면 이 인 스 턴 스 는 초기 화 됩 니 다.
    /// 
    
        ///    (   )
    
        /// 
    
        class Singleton1
    
        {
    
            #region Fields
    
            /// 
    
            ///             
    
            /// 
    
            private static Singleton1 Instance = new Singleton1();
    
            #endregion
    
    
            #region Constructors
    
            /// 
    
            ///       
    
            /// 
    
            private Singleton1()
    
            {
    
            }
    
            #endregion
    
    
            #region Public Methods
    
            /// 
    
            ///         
    
            /// 
    
            /// 
    
            public static Singleton1 GetSingleton1()
    
            {
    
                return Instance;
    
            }
    
            #endregion
    
            
    
    }

     
    단일 모드 의 장점:
  • 단일 사례 모델 에서 활동 하 는 단일 사례 는 하나의 인 스 턴 스 만 있 고 단일 사례 류 의 모든 실례 화 에 대해 똑 같은 인 스 턴 스 를 얻 었 다.이렇게 하면 다른 대상 이 자신 에 대한 실례 화 를 방지 하고 모든 대상 이 하나의 실례 에 접근 하도록 확보한다     2. 단일 사례 모델 은 일정한 신축성 을 가지 고 자신 이 실례 화 과정 을 통제 하 며 류 는 실례 화 과정 을 바 꾸 는 데 상응하는 신축성 을 가진다.     3. 유일한 인 스 턴 스 에 대한 제어 접근 을 제공 합 니 다.     4. 시스템 메모리 에 하나의 대상 만 존재 하기 때문에 시스템 자원 을 절약 할 수 있 습 니 다. 자주 만 들 고 없 애 는 대상 이 필요 할 때 단일 모델 은 시스템 의 성능 을 향상 시 킬 수 있 습 니 다.     5. 가 변 수의 인 스 턴 스 를 허용 합 니 다.     6. 공유 자원 의 다 중 점용 을 피한다. 

  • 단일 모드 의 단점:
  • 변화 하 는 대상 에 적용 되 지 않 는 다. 만약 에 같은 유형의 대상 이 서로 다른 사례 장면 에서 변 화 를 일 으 키 려 면 한 사례 로 데이터 의 오 류 를 일 으 켜 서로의 상 태 를 저장 할 수 없다.     2. 단리 모델 에 추상 층 이 없 기 때문에 단일 사례 의 확장 에 큰 어려움 이 있다.     3. 사례 류 의 직책 이 너무 무 거 워 서 어느 정도 에 '단일 직책 원칙' 에 위배 된다.     4. 단일 사례 를 남용 하면 부정적인 문 제 를 가 져 올 수 있다. 예 를 들 어 자원 을 절약 하기 위해 데이터 베 이 스 를 연결 하 는 풀 대상 으로 디자인 한 단일 사례 는 공유 연결 풀 대상 의 프로그램 이 너무 많아 서 연결 풀 이 넘 칠 수 있다.만약 실례 화 된 대상 이 장시간 이용 되 지 않 는 다 면 시스템 은 쓰레기 로 여 겨 져 회수 되 고 이 는 대상 상태의 분실 을 초래 할 것 이다. 

  • 사용 주의사항:
       1. 사용 시 반사 모드 로 단일 예 를 만 들 수 없습니다. 그렇지 않 으 면 새로운 대상 을 예화 합 니 다.     2. 게 으 른 단일 모드 사용 시 스 레 드 안전 문제 주의     3. 굶 주 림 사례 모델 과 게 으 름 사례 모델 의 구조 방법 은 모두 개인 적 인 것 이기 때문에 계승 할 수 없고 일부 사례 모델 은 계승 할 수 있다 (예 를 들 어 등록 식 모델). 
    적용 필드:     단일 모드 에 서 는 하나의 대상 만 만 만 들 수 있 기 때문에 메모 리 를 절약 하고 대상 의 접근 속 도 를 가속 화하 기 때문에 대상 은 공용 이 어야 합 니 다.    여러 모듈 이 같은 데이터 원본 연결 대상 을 사용 하 는 등 장소 에 적합 합 니 다.예:     1. 잦 은 예화 후 소각 대상 이 필요 합 니 다.     2. 대상 을 만 드 는 데 너무 오래 걸 리 거나 자원 을 너무 많이 소모 하지만 자주 사용 하 는 대상.     3. 상태 가 있 는 도구 류 대상.     4. 데이터베이스 나 파일 에 자주 접근 하 는 대상.

    좋은 웹페이지 즐겨찾기