깊이 들 어가 기 쉬 운 디자인 모델 (3) 단일 사례 모델

4520 단어

     이전에 디자인 모델 을 배 울 때 단일 모델 을 배 웠 지만 진정 으로 사용 하지 않 았 기 때문에 단일 사례 에 대한 이해 가 깊 지 않다.최근 시스템 을 만 들 때 단일 모드 를 사용 했다.다음은 소개 하 겠 습 니 다.
     단일 모드: 하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 합 니 다.일반적으로 우 리 는 하나의 전역 변 수 를 대상 에 접근 하 게 할 수 있 지만, 그것 은 당신 이 여러 대상 을 예화 하 는 것 을 방지 할 수 없습니다.가장 좋 은 방법 은 클래스 자체 가 그것 의 유일한 인 스 턴 스 를 저장 하도록 하 는 것 이다.이 종 류 는 다른 인 스 턴 스 가 생 성 되 지 않 고 인 스 턴 스 에 접근 하 는 방법 을 제공 할 수 있 습 니 다.
      단 례 를 실현 하 는 방법 은 매우 많다. 우 리 는 VB. NET 의 코드 로 실현 한다. 다음은 몇 가 지 를 살 펴 보 자.
1. 라인 이 안전 하지 않 음
    코드 가 있 는 프로 세 스 중 여러 개의 스 레 드 가 동시에 실행 되 고 있 으 면 이 스 레 드 는 이 코드 를 동시에 실행 할 수 있 습 니 다.매번 실행 결과 가 단일 스 레 드 가 실 행 된 결과 와 같 고 다른 변수의 값 도 예상 한 것 과 같 으 면 스 레 드 가 안전 합 니 다.
Public NotInheritable Class Singleton
    Shared m_instance As Singleton = Nothing
    

    Private Sub New()
    End Sub

    Public Shared ReadOnly Property Instance() As Singleton
        Get
            If m_instance Is Nothing Then
                m_instance = New Singleton()
            End If
            Return m_instance
        End Get
    End Property
End Class

       이러한 방식 의 실현 은 스 레 드 에 있어 서 안전 하지 않 습 니 다. 다 중 스 레 드 환경 에서 Singleton 류 의 여러 인 스 턴 스 를 얻 을 수 있 기 때 문 입 니 다.만약 에 두 개의 스 레 드 가 동시에 판단 (m instance Is Nothing) 되 고 결 과 를 얻 으 면 두 스 레 드 가 모두 Singleton 과 같은 인 스 턴 스 를 만 듭 니 다. 그러면 Singleton 모델 의 원칙 에 어 긋 납 니 다.
2. 스 레 드 보안
Public NotInheritable Class Singleton
    Shared m_instance As Singleton = Nothing
    Shared ReadOnly padlock As New Object()

    Private Sub New()

    End Sub

    Public Shared ReadOnly Property Instance() As Singleton
        Get
            SyncLock padlock
                If m_instance Is Nothing Then
                    m_instance = New Singleton()
                End If
                Return m_instance
            End SyncLock
        End Get
    End Property
End Class

     이런 방식 의 실현 은 스 레 드 에 있어 서 안전 하 다.스 레 드 가 들 어 갈 때 잠 금 을 추가 한 다음 에 대상 이 만 들 어 졌 는 지 확인 합 니 다. 같은 시간 에 잠 금 을 추가 한 프로그램 은 하나의 스 레 드 만 들 어 갈 수 있 기 때 문 입 니 다.이 경우 대상 인 스 턴 스 는 가장 먼저 들 어 온 스 레 드 에서 만 들 어 졌 으 며, 나중에 스 레 드 가 들 어 갈 때 (m intence Is Nothing) 가짜 로 대상 인 스 턴 스 를 만 들 지 않 습 니 다.그러나 이런 실현 방식 은 추가 비용 을 늘 려 성능 을 잃 었 다.
3. 이중 잠 금
Public NotInheritable Class Singleton
    Shared m_instance As Singleton = Nothing
    Shared ReadOnly padlock As New Object()

    Private Sub New()
    End Sub

    Public Shared ReadOnly Property Instance() As Singleton
        Get
            If m_instance Is Nothing Then
                SyncLock padlock
                    If m_instance Is Nothing Then
                        m_instance = New Singleton()
                    End If
                End SyncLock
            End If
            Return m_instance
        End Get
    End Property
End Class

       이러한 실현 방식 은 다 중 스 레 드 에 있어 안전 하 다. 또한 스 레 드 는 매번 자 물 쇠 를 추가 하 는 것 이 아니 라 대상 인 스 턴 스 가 만 들 어 지지 않 았 다 고 판단 할 때 만 자 물 쇠 를 추가 하 는 것 이다. 우리 위의 첫 번 째 부분 에 대한 분석 이 있 으 면 자 물 쇠 를 추가 한 후에 대상 이 이미 만 들 어 졌 는 지 판단 해 야 한 다 는 것 을 알 고 있다.그것 은 스 레 드 병발 문 제 를 해결 하 는 동시에 모든 m 를 피한다.인 스 턴 스 속성 방법의 호출 에 독점 잠 금 이 나타 납 니 다.첫 방문 대상 에 대한 예화 지연 도 허용 합 니 다.실제로 응용 프로그램 은 이런 유형의 실현 을 필요 로 하지 않 는 다.대부분의 경우 우 리 는 정적 으로 초기 화 할 것 이다.
4. 정적 초기 화
Public NotInheritable Class Singleton
    Shared ReadOnly m_instance As New Singleton()

    Shared Sub New()
    End Sub

    Private Sub New()
    End Sub

    Public Shared ReadOnly Property Instance() As Singleton
        Get
            Return m_instance
        End Get
    End Property
End Class

      이 실현 은 앞의 예제 와 유사 하 며, 다른 점 은 공공 언어 실행 라 이브 러 리 에 의존 하여 변 수 를 초기 화 하 는 것 이다.싱글 톤 모드 에서 해결 하려 는 두 가지 기본 적 인 문 제 를 해결 할 수 있 습 니 다. 전역 접근 과 실례 화 제어 입 니 다.공공 정적 속성 은 방문 실례 에 전역 접근 점 을 제공 합 니 다.그 밖 에 구조 함 수 는 개인 적 인 것 이기 때문에 클래스 자체 이외 의 사례 로 Singleton 류 를 예화 할 수 없습니다.따라서 변 수 는 시스템 에 존재 할 수 있 는 유일한 인 스 턴 스 를 참조 합 니 다.Singleton 인 스 턴 스 는 개인 정적 구성원 변수 에 의 해 참조 되 기 때문에 인 스 턴 스 속성 에 대한 호출 이 처음 인용 되 기 전에 예화 되 지 않 습 니 다.
5. 초기 화 지연
Public NotInheritable Class Singleton
    Private Sub New()
    End Sub

    Public Shared ReadOnly Property Instance() As Singleton
        Get
            Return Nested.instance
        End Get
    End Property

    Private Class Nested
        Shared Sub New()
        End Sub
        Friend Shared ReadOnly instance As New Singleton()
    End Class
End Class

    초기 화 작업 은 Nested 류 의 정적 구성원 이 수행 하여 지연 초기 화 를 실현 합 니 다.

좋은 웹페이지 즐겨찾기