디자인 모드 - 단일 모드 상세 설명

디자인 모드 - 단일 모드 상세 설명
개술
단일 모드 (Singleton) 는 하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 합 니 다.
일반적으로 우 리 는 하나의 전역 변 수 를 대상 에 접근 하 게 할 수 있 지만, 그것 은 당신 이 여러 대상 을 예화 하 는 것 을 방지 할 수 없습니다.가장 좋 은 방법 은 클래스 자체 가 그것 의 유일한 인 스 턴 스 를 저장 하도록 하 는 것 이다.이 종 류 는 다른 인 스 턴 스 가 생 성 되 지 않 고 인 스 턴 스 에 접근 하 는 방법 을 제공 할 수 있 습 니 다.
필드 사용
자원 접근 충돌 처리
  • 응용 프로그램의 로그 처리 클래스
  • 사이트 의 카운터 모듈
  • 전역 유일 클래스
  • 정보 류 설정
  • 유일한 증가 ID 인 코딩 생 성기
  • 제한성
  • OOP 특성 에 대한 단일 지원 이 우호 적 이지 않다
  • 우 리 는 OOP 의 4 대 특성 이 포장, 추상, 계승, 다 태 라 는 것 을 안다.단일 사례 의 이런 디자인 모델 은 그 중의 추상, 계승, 다 형 에 대해 모두 잘 지지 하지 못 한다.일반적인 단일 모델 은 '실현 이 아 닌 인 터 페 이 스 를 바탕 으로 하 는 디자인 원칙' 을 위반 하고 넓 은 의미 에서 이해 하 는 OOP 의 추상 적 인 특성 에 위배 된다.
  • 단일 사례 는 클래스 간 의 의존 관 계 를 숨 길 수 있다
  • 우 리 는 코드 의 가 독성 이 매우 중요 하 다 는 것 을 안다.코드 를 읽 을 때 우 리 는 클래스 와 클래스 간 의 의존 관 계 를 한눈 에 알 아 보고 이 클래스 가 어떤 외부 클래스 에 의존 하 는 지 알 고 싶 습 니 다.구조 함수, 파라미터 전달 등 방식 으로 설명 하 는 클래스 간 의 의존 관 계 를 통 해 우 리 는 함수 의 정 의 를 보면 쉽게 식별 할 수 있다.단, 단일 클래스 는 생 성 을 표시 할 필요 가 없고 매개 변수 전달 에 의존 할 필요 가 없 으 며 함수 에서 직접 호출 하면 됩 니 다.만약 코드 가 비교적 복잡 하 다 면, 이런 호출 관 계 는 매우 은밀 할 것 이다.코드 를 읽 을 때 우 리 는 모든 함수 의 코드 가 실현 되 는 지 자세히 살 펴 봐 야 이 클래스 가 어떤 단일 클래스 에 의존 하 는 지 알 수 있다.
  • 코드 의 확장 성에 대한 단일 사례
  • 우 리 는 하나의 예 류 는 하나의 대상 인 스 턴 스 만 있 을 수 있다 는 것 을 안다.만약 미래 어느 날, 우 리 는 코드 에 두 개의 인 스 턴 스 나 여러 개의 인 스 턴 스 를 만들어 야 한다 면, 코드 에 대해 비교적 큰 변경 이 있어 야 한다.당신 은 이런 수요 가 있 을 것 이 라 고 말 할 수 있 습 니까?하나의 예 류 는 대부분 상황 에서 전체 류 를 나타 내 는데 어떻게 두 개 또는 여러 개의 인 스 턴 스 가 필요 합 니까?실제로 이런 수 요 는 드 물 지 않다.우 리 는 데이터베이스 연결 탱크 를 가지 고 예 를 들 어 설명 한다.시스템 설계 초기 에 우 리 는 시스템 에 데이터베이스 연결 탱크 만 있어 야 데이터베이스 연결 자원 에 대한 소 모 를 편리 하 게 제어 할 수 있다 고 생각 했다.그래서 우 리 는 데이터베이스 연결 탱크 류 를 단일 클래스 로 설계 했다.그러나 그 후에 우 리 는 시스템 에서 일부 SQL 문 구 는 매우 느리게 작 동 하 는 것 을 발견 했다.이 SQL 문 구 는 실행 할 때 데이터베이스 연결 자원 을 장시간 사용 하여 다른 SQL 요청 에 응답 하지 못 합 니 다.이 문 제 를 해결 하기 위해 서, 우 리 는 느 린 SQL 을 다른 SQL 과 격 리 하여 실행 하 기 를 희망 합 니 다.이러한 목적 을 실현 하기 위해 우 리 는 시스템 에서 두 개의 데이터베이스 연결 탱크 를 만 들 수 있다. 느 린 SQL 은 하나의 데이터베이스 연결 탱크 를 독차지 하고 다른 SQL 은 다른 데이터베이스 연결 탱크 를 독차지 하면 느 린 SQL 이 다른 SQL 의 집행 에 영향 을 주지 않도록 할 수 있다.
  • 코드 에 대한 테스트 가능성 이 우호 적 이지 않다
  • 단일 모드 의 사용 은 코드 의 테스트 가능성 에 영향 을 줄 수 있다.만약 단일 클래스 가 비교적 무 거 운 외부 자원, 예 를 들 어 DB 에 의존한다 면, 우 리 는 단원 테스트 를 쓸 때, mock 방식 을 통 해 그것 을 교체 할 수 있 기 를 희망 합 니 다.단일 클래스 의 이러한 하 드 인 코딩 식 사용 방식 은 mock 교 체 를 실현 할 수 없습니다.
    어떻게 실현 합 니까 (C \ #)
    본 논문 의 실현 코드 는 모두 C \ # 를 바탕 으로 한다.일반적인 실현 방식 은 두 가지 가 있 는데 그것 이 바로 굶 주 린 한식 과 게으름뱅이 식 이다.굶 주 린 한식, 즉 정적 초기 화 방식 으로 불 러 오 면 실례 화 되 는 대상 이기 때문에 시스템 자원 을 미리 점용 해 야 한다.그러나 게으름뱅이 식 은 다 중 스 레 드 방문 의 안전성 문제 에 직면 할 수 있 으 므 로 이중 잠 금 과 같은 처 리 를 해 야 안전 을 확보 할 수 있다.그래서 어떤 방식 을 사용 하 느 냐 는 실제 수요 에 달 려 있다.
    이중 잠 금 (게으름뱅이 식)/// /// - /// public class Singleton { private static Singleton instance; private static readonly object syncRoot = new object();// private Singleton() { }// , new public static Singleton Instance() { if (instance == null)// , { lock (syncRoot)// { if (instance == null) { instance = new Singleton(); } } } return instance; } }
    정적 내부 클래스 (게으름뱅이 식)/// /// - /// public class Singleton2 { private Singleton2() { } private static class SingletonInstance { public static Singleton2 Instance = new Singleton2(); } public static Singleton2 GetInstance() { return SingletonInstance.Instance; } }
    정적 초기 화 (굶 주 린 식)/// /// /// public sealed class Singleton3 { private static readonly Singleton3 instance = new Singleton3(); private Singleton3() { } public static Singleton3 GetInstance() { return instance; } }
    대안
  • 공장 모델
  • IOC 용기
  • 깊이 이해 하 다
    어떻게 단일 모델 중의 유일 성 을 이해 합 니까?
    단일 모드 의 정의 에서 "하나의 클래스 는 하나의 대상 만 만 들 수 있 습 니 다" 라 고 언급 했다.그 대상 의 유일한 역할 범 위 는 무엇 입 니까?스 레 드 에서 하나의 대상 만 만 만 들 수 있 는 것 을 말 합 니까? 아니면 프로 세 스 에서 하나의 대상 만 만 만 들 수 있 는 것 을 말 합 니까?정 답 은 후자 다. 즉, 단일 모드 가 만 든 대상 은 프로 세 스 의 유일한 것 이다.프로 세 스 간 에 주소 공간 을 공유 하지 않 습 니 다. 만약 에 우리 가 하나의 프로 세 스 에서 다른 프로 세 스 (예 를 들 어 코드 에 fork () 문 구 를 만 들 면 프로 세 스 가 이 문 구 를 실행 할 때 새로운 프로 세 스 를 만 듭 니 다) 를 만 들 면 운영 체 제 는 새로운 프로 세 스에 새로운 주소 공간 을 할당 하고 오래된 프로 세 스 주소 공간의 모든 내용 을 할당 합 니 다.새 프로 세 스 의 주소 공간 에 다시 복사 합 니 다. 이 내용 은 코드, 데이터 (예 를 들 어 user 임시 변수, user 대상) 를 포함 합 니 다.따라서 하나의 예 류 는 오래된 프로 세 스 에 존재 하고 하나의 대상 만 존재 할 수 있 으 며 새로운 프로 세 스 에 도 존재 하고 하나의 대상 만 존재 할 수 있 습 니 다.그리고 이 두 대상 은 같은 대상 이 아니다. 즉, 단일 클래스 에서 대상 의 유일한 역할 범 위 는 프로 세 스 내 에 있 고 프로 세 스 간 에 유일한 것 이 아니다.
    어떻게 라인 의 유일한 단 례 를 실현 합 니까?
    우 리 는 하나의 맵 을 통 해 대상 을 저장 합 니 다. 그 중에서 key 는 스 레 드 ID 이 고 value 는 대상 입 니 다.이렇게 하면 우 리 는 서로 다른 스 레 드 가 서로 다른 대상 에 대응 하고 같은 스 레 드 는 한 대상 만 대응 할 수 있다.
    어떻게 군집 환경 에서 의 단일 예 를 실현 합 니까?
    우선, 우 리 는 먼저 '군집 의 유일한' 사례 가 무엇 인지 설명 하 는 것 이 좋 겠 다.우 리 는 여전히 그것 을 '프로 세 스 유일', '스 레 드 유일' 과 비교 할 것 이다.'프로 세 스 유일' 은 프로 세 스 내 에서 유일 하고 프로 세 스 간 에 유일 하지 않다 는 것 을 말한다.'스 레 드 유일' 은 스 레 드 내 에서 유일 하고 스 레 드 간 에 유일 하지 않다 는 것 을 말한다.군집 은 여러 프로 세 스 로 구 성 된 집합 에 해당 하 며, '군집 유일' 은 프로 세 스 내 에서 유일 하고 프로 세 스 간 에 도 유일 하 다.서로 다른 프로 세 스 간 에 같은 대상 을 공유 하고 같은 종류의 여러 대상 을 만 들 수 없다 는 것 이다.
    우 리 는 이 단일 대상 을 직렬 화하 여 외부 공유 저장 소 (예 를 들 어 파일) 에 저장 해 야 한다.프로 세 스 가 이 단일 대상 을 사용 할 때 외부 공유 저장 소 에서 메모리 로 읽 고 대상 으로 역 정렬 한 다음 사용 해 야 합 니 다. 사용 이 완료 되면 외부 공유 저장 소 에 다시 저장 해 야 합 니 다.프로 세 스 간 에 항상 하나의 대상 만 존재 하도록 하기 위해 서 는 하나의 프로 세 스 가 대상 을 가 져 온 후에 대상 을 잠 그 고 다른 프로 세 스 가 다시 가 져 오지 않도록 해 야 합 니 다.프로 세 스 가 이 대상 을 사용 한 후에 대상 을 메모리 에서 명시 적 으로 삭제 하고 대상 에 대한 잠 금 을 풀 어야 합 니 다.
    어떻게 여러 가지 모델 을 실현 합 니까?
    단일 모델 개념 에 대응 하 는 또 하나의 다 중 모델 이 있다.그러면 어떻게 여러 가지 모델 을 실현 합 니까?'단일 예' 는 하나의 클래스 가 하나의 대상 만 만 들 수 있다 는 것 을 말한다.이에 대응 하여 '다 중 예' 는 하나의 클래스 가 여러 개의 대상 을 만 들 수 있 지만 개 수 는 제한 이 있다 는 것 을 말한다. 예 를 들 어 세 개의 대상 만 만 만 들 수 있다.
    여러 사례 의 실현 도 비교적 간단 하 다. 하나의 맵 을 통 해 대상 유형 과 대상 간 의 대응 관 계 를 저장 하여 대상 의 개 수 를 제어 한다.
    참고 자료
  • . NET 디자인 모델 (1): 1.1 단일 모델 (Singleton Pattern)
  • 제2 1 장: 단일 모델
  • 극 객 시간 칼럼
  • 좋은 웹페이지 즐겨찾기