단일 모델 의 장단 점

단일 모드 (Singleton Pattern): 하나의 인 스 턴 스 만 있 는 지 확인 하고 자체 적 으로 예화 하여 전체 시스템 에 이 인 스 턴 스 를 제공 합 니 다. 이 종 류 는 하나의 인 스 턴 스 라 고 하 며 전체 방문 방법 을 제공 합 니 다.단일 모드 는 대상 생 성 모드 입 니 다.
단일 모드 는 세 가지 요점 이 있 습 니 다. 하 나 는 특정한 유형 에 하나의 인 스 턴 스 만 있 을 수 있 습 니 다.둘째, 이 인 스 턴 스 를 자체 적 으로 만들어 야 합 니 다.셋째, 그것 은 반드시 스스로 전체 시스템 에 이 인 스 턴 스 를 제공 해 야 한다.단일 모델 은 구조 가 가장 간단 한 디자인 모델 로 그의 핵심 구조 에 단일 사례 라 고 불 리 는 특수 류 만 포함한다.
단일 모드 구성 도 에는 하나의 단일 캐릭터 만 포함 되 어 있 습 니 다. Singleton (단일 사례): 단일 사례 의 내부 에서 하나의 인 스 턴 스 만 생 성 하 는 동시에 정적 인 getInstance () 공장 방법 을 제공 하여 고객 이 그의 유일한 인 스 턴 스 를 방문 할 수 있 도록 합 니 다.외부 에서 사례 화 를 방지 하기 위해 구조 함 수 를 사유 로 설계 합 니 다.단일 클래스 내부 에서 singleton 형식의 정적 대상 을 정의 하여 외부 공유 의 유일한 인 스 턴 스 로 합 니 다.주요 장점:
4. 567917. 1. 유일한 인 스 턴 스 에 대한 제어 접근 을 제공 합 니 다
4. 567917. 2. 시스템 메모리 에 하나의 대상 만 존재 하기 때문에 시스템 자원 을 절약 할 수 있 고 자주 만 들 고 소각 해 야 하 는 대상 의 단일 모델 에 대해 시스템 의 성능 을 향상 시 킬 수 있다
4. 567917. 3. 가 변 수 를 허용 하 는 인 스 턴 스
주요 단점:
4. 567917. 1. 단리 모델 에 추상 층 이 없 기 때문에 단일 사례 의 확장 에 큰 어려움 이 있다
4. 567917. 2. 사례 류 의 직책 이 너무 무 거 워 서 어느 정도 에 '단일 직책 원칙' 에 위배 된다
4. 567917. 3. 단일 사례 를 남용 하면 부정적인 문 제 를 가 져 올 것 이다. 예 를 들 어 자원 을 절약 하기 위해 데이터 베이스 연결 탱크 대상 을 디자인 한 단일 사례 류 는 공유 연결 탱크 대상 의 프로그램 이 너무 많아 서 연결 탱크 가 넘 칠 수 있다.만약 실례 화 된 대상 이 장시간 이용 되 지 않 는 다 면 시스템 은 쓰레기 로 여 겨 져 회수 되 고 대상 상태의 손실 을 초래 할 것 이다
적용 장면 은 다음 과 같은 상황 에서 단일 모드 를 사용 하 는 것 을 고려 할 수 있 습 니 다. - (1) 시스템 은 하나의 인 스 턴 스 대상 만 필요 합 니 다. 예 를 들 어 시스템 이 유일한 시리 얼 번호 생 성기 나 자원 관리 자 를 제공 하 라 고 요구 하거나 자원 소모 가 너무 커서 하나의 대상 만 만 만 들 수 있 습 니 다. -(2) 고객 호출 클래스 의 단일 인 스 턴 스 는 하나의 공공 방문 점 만 사용 할 수 있 고 이 공공 방문 점 을 제외 하고 다른 경 로 를 통 해 이 인 스 턴 스 를 방문 할 수 없습니다.
굶 주 린 한식 단 례 류 와 게 으 른 한식 단 례 류 를 비교 하면 굶 주 린 한식 단 례 류 는 클래스 가 불 러 올 때 자신 을 실례 화한 다. 다 선정 방문 문 제 를 고려 하지 않 아 도 실례 의 유일 성 을 확보 할 수 있다 는 장점 이 있다.호출 속도 와 반응 시간 측면 에서 볼 때 단일 대상 이 처음부터 만 들 어 졌 기 때문에 게으름뱅이 식 단일 사례 보다 우수 하 다.그러나 시스템 이 실 행 될 때 이 단일 대상 을 사용 해 야 하 든 안 하 든 클래스 로 딩 할 때 이 대상 을 만들어 야 하기 때문에 자원 이용 효율 적 인 측면 에서 볼 때 굶 주 린 식 단일 사례 는 게 으 른 식 단일 사례 에 미 치지 못 하고 시스템 로 딩 할 때 굶 주 린 식 단일 사례 를 만들어 야 하기 때문에 로 딩 시간 이 비교적 길 수 있 습 니 다.게으름뱅이 식 단일 사례 류 는 처음 사용 할 때 만 들 어 졌 습 니 다. 시스템 자원 을 계속 차지 하지 않 아 도 되 고 로드 지연 을 실현 할 수 있 습 니 다. 그러나 여러 개의 스 레 드 를 동시에 방문 하 는 문 제 를 처리 해 야 합 니 다. 특히 단일 사례 류 가 자원 컨트롤 러 로 서 예화 할 때 반드시 자원 초기 화 와 관련 되 고 자원 초기 화 는 많은 시간 을 소모 할 수 있 습 니 다.이 는 다 중 스 레 드 가 나타 나 면서 처음으로 이런 것 을 인용 할 확률 이 높 아 지고 이중 검사 잠 금 등 체 제 를 통 해 제어 해 야 한 다 는 뜻 으로 시스템 성능 에 어느 정도 영향 을 미 칠 수 있다.
더 좋 은 단일 사례 실현 방법 인 굶 주 린 한식 단일 사례 류 는 로드 지연 을 실현 할 수 없 으 며 앞으로 사용 하 든 안 하 든 항상 메모 리 를 차지 할 수 없다.게으름뱅이 식 단일 라인 의 안전 제 어 는 번 거 롭 고 성능 도 영향 을 받는다.이 를 통 해 알 수 있 듯 이 굶 주 린 한식 사례 든 게으름뱅이 식 사례 든 모두 이런 저런 문제 가 존재 한다. 두 가지 단점 을 모두 극복 하고 이들 의 장점 을 하나 로 합 칠 수 있 는 방법 이 있 을 까?정 답: Yes!Initialization on Demand Holder (IoDH) 라 고 불 리 는 더 좋 은 기술 을 배 워 보 겠 습 니 다.IoDH 에서 우 리 는 단일 클래스 에 정적 (static) 내부 클래스 를 추가 하고 이 내부 클래스 에 단일 대상 을 만 든 다음 에 이 단일 대상 을 getInstance () 방법 으로 외부 에 되 돌려 사용 합 니 다. 코드 는 다음 과 같 습 니 다.
//Initialization on Demand Holder
public class Singleton
{
       private  Singleton()
{
       }

       private static class HolderClass
       {
              private final static Singleton  instance = new Singleton();
       }

       public static Singleton getInstance()
       {
              return HolderClass.instance;
       }

       public  static void main(String args[])
       {
              Singleton  s1, s2;
s1 = Singleton.getInstance();
              s2  = Singleton.getInstance();
              System.out.println(s1==s2);
       }
}

상기 코드 를 컴 파일 하고 실행 합 니 다. 실행 결 과 는 true, 즉 만 든 단일 대상 s1 과 s2 가 같은 대상 입 니 다.정적 단일 예 대상 이 Singleton 의 구성원 변수 로 직접 예화 되 지 않 았 기 때문에 클래스 로 딩 할 때 Singleton 을 예화 하지 않 습 니 다. getInstance () 를 처음 호출 할 때 내부 클래스 HolderClass 를 불 러 옵 니 다. 이 내부 클래스 에서 static 형식의 변수 인 스 턴 스 를 정의 합 니 다. 이 때 먼저 이 구성원 변 수 를 초기 화하 고 자바 가상 머 신 으로 스 레 드 안전성 을 확보 합 니 다.이 구성원 변 수 를 한 번 만 초기 화 할 수 있 도록 합 니 다.getInstance () 방법 은 스 레 드 잠 금 이 없 기 때문에 성능 에 영향 을 주지 않 습 니 다.IoDH 를 사용 하면 로 딩 지연 을 실현 할 수 있 을 뿐만 아니 라 스 레 드 안전 도 확보 할 수 있 고 시스템 성능 에 영향 을 주지 않 으 며 가장 좋 은 자바 언어 단일 모델 실현 방식 (프로 그래 밍 언어 자체 의 특성 과 관련 되 어 많은 대상 언어 가 IoDH 를 지원 하지 않 는 다 는 단점) 을 잃 지 않 습 니 다.

좋은 웹페이지 즐겨찾기