Latest web development tutorials

싱글 톤 패턴

싱글 (싱글 톤 패턴) 자바는 단순한 디자인 패턴 중 하나입니다. 디자인 패턴이 유형의 개체를 만들 수있는 가장 좋은 방법을 제공하는 스키마를 작성 속한다.

이 모델은 단 하나의 객체가 생성되는 것을 보장하면서, 자신의 객체를 생성을 담당하는 하나의 클래스를 포함한다. 이 클래스는 해당 클래스의 객체를 인스턴스화 할 필요가 없습니다, 그들의 방문의 유일한 목적은, 그것은 직접 액세스 할 수 있습니다.

참고 :

  • 1, 싱글 톤 클래스는 하나의 인스턴스를 가질 수 있습니다.
  • 2, 싱글 톤 클래스는 자신의 고유 한 인스턴스를 만들어야합니다.
  • 3 싱글 클래스는 모든 다른 객체에이 예제를 제공해야합니다.

소개

의도 : 클래스의 하나의 인스턴스를 확인하고 액세스 할 수있는 글로벌 액세스 포인트를 제공한다.

주요 솔루션 : 자주 생성되고 파괴 글로벌 클래스를 사용합니다.

때 사용하기 : 인스턴스의 수를 제어하고자하는 경우 시스템 리소스를 절약 할 때.

해결 방법 : 다음 생성되지 않은 경우는, 반환하는 경우 시스템이 이미이 하나의 경우가 있는지 여부를 결정하는 단계를 포함한다.

키 코드 : 생성자는 비공개입니다.

적용 예 : 1, 파티는 하나의 대통령을 가질 수 있습니다.2 윈도우는 필연적 여러 프로세스 또는 스레드 동시에 현상 문서가 모든 파일의 처리는 고유 한 인스턴스가 수행해야 할 경우 다중 프로세스가 파일의 동작에있어서, 멀티 - 스레드이다. 도 3에서, 복합기 관리자들 중 일부는 종종 동일한 파일을 인쇄 할 수있는 두 개의 프린터를 처리하는 데 필요한 출력이 프린터 컴퓨터와 같은 단일 케이스 모델로 설계된다.

장점 : 1, 메모리에 하나의 인스턴스 만 감소 메모리 오버 헤드 (예 : 관리 홈 페이지 캐시의 학교 등) 특히 자주 생성하고 파괴하는 경우.2, (예 : 파일 쓰기 작업 등) 자원의 여러 점유를 방지 할 수 있습니다.

단점 : 없음 인터페이스는 클래스뿐만 아니라 인스턴스화하는 방법 등 외부에 내부 논리에 대해 우려해야한다, 상속, 단일 책임 원칙에 충돌하지.

사용 시나리오 : 1, 고유 일련 번호의 생성을 필요로한다.2, WEB 카운터, 하나의 경우에 한 번 리가없는 모든 데이터베이스 캐시를 새로 고칩니다. 3, 같은 데이터베이스 등을 I / O 연결과 같은 자원의 과도한 소비에 대한 필요성에 의해 생성 된 객체입니다.

참고의 getInstance () 메소드는 여러 번 인스턴스화 원인 인스턴스로 다중 스레드를 방지 (Singleton.class)는 동기화 잠금 동기화의 사용을 필요로한다.

실현

우리는SingleObject 클래스를생성합니다.SingleObject클래스는 전용 생성자와 정적 인스턴스를 가지고있다.

SingleObject클래스는 정적 인스턴스 외부 얻기위한 정적 인 방법을 제공한다.SingletonPatternDemo는SingleObject 클래스를 사용하여 우리의 데모 클래스는SingleObject개체를 얻을 수 있습니다.

싱글 톤 패턴 UML 다이어그램

1 단계

싱글 톤 클래스를 만듭니다.

SingleObject.java

공용 클래스 SingleObject {

   //) (= 새로운 SingleObject을 개인 정적 SingleObject 예를 SingleObject 객체를 생성;

   //} {) 생성자 개인을 확인, 그래서 클래스는 개인 SingleObject을 (인스턴스화되지 않습니다

   // {) (공개 가능한 정적 SingleObject의 getInstance의 유일한 객체를 가져옵니다
      인스턴스를 반환;
   }

   공공 무효 showMessage () {
      에서 System.out.println ( "안녕하세요!");
   }
}

2 단계

싱글 톤 클래스의 객체를 가져옵니다.

SingletonPatternDemo.java

공용 클래스 SingletonPatternDemo {
   공공 정적 무효 메인 (문자열 []에 args) {

      // 생성자 // 불법 컴파일 타임 오류 : 생성자 SingleObject는 () 표시되지 // SingleObject 개체 = 새 SingleObject ();

      // 유일한 개체를 사용할 수 SingleObject 오브젝트를 취득 = SingleObject.getInstance ();

      // 디스플레이 메시지 object.showMessage ();
   }
}

3 단계

출력을 확인합니다.

안녕하세요!

여러 싱글 톤 패턴 구현

다음과 같이 싱글 톤 패턴을 여러 가지 방법으로 구현 :

1, 게으른 스타일, 스레드 안전

게으른 초기화 위치 : 예

멀티 스레드 안전 : 없음

난이도를 달성 : 쉬운

설명 :이 방법은 가장 큰 문제는 멀티 스레딩을 지원하지 않습니다 구현을 달성하기 위해 가장 기본적인 방법입니다.동기가없는 잠금 없으므로 엄밀 그것은 싱글 아니므.
이 방법으로 게으른 로딩은 분명히 멀티 스레드 작동하지 않는 스레드 안전 작업을 필요로하지 않습니다.

코드 예제 :

공용 클래스 싱글 {  
    개인 정적 싱글 인스턴스;  
    개인 싱글 () {}  
  
    공공 정적 싱글 톤의 getInstance () {  
    경우 (예 == NULL) {  
        예를 = 새로운 싱글 톤 ();  
    }  
    인스턴스를 반환;  
    }  
}  

여러 구현의 다음 발표는 다중 스레드를 지원하지만 성능에서 차이가 있습니다.

2, 게으른 스타일, 스레드 안전

게으른 초기화 위치 : 예

멀티 스레드 안전 : 예

난이도를 달성 : 쉬운

설명 : 좋은 지연로드를 이러한 방식으로, 멀티 스레드에서 잘 작동 할 수 있지만, 매우 낮은 효율은, 99 %의 경우 동기화를 필요로하지 않는다.
장점 : 첫 번째 통화의 초기화는 낭비 메모리를 방지 할 수 있습니다.
단점 : 하나의 사건을 보장하기 위해 동기화 잠겨 있어야하지만, 잠금 효율성에 영향을 미칠 것입니다.
의 getInstance () 애플리케이션의 성능 (자주 사용되는) 중요하지 않다.

코드 예제 :

공용 클래스 싱글 {  
    개인 정적 싱글 인스턴스;  
    개인 싱글 () {}  
    공공 정적 동기 싱글 톤의 getInstance () {  
    경우 (예 == NULL) {  
        예를 = 새로운 싱글 톤 ();  
    }  
    인스턴스를 반환;  
    }  
} 

3, 굶주린 식

게으른 초기화 위치 : 없음

멀티 스레드 안전 : 예

난이도를 달성 : 쉬운

설명 : 그것은 일반적인, 그러나 쓰레기 오브젝트하는 경향이있다.
장점 : 잠겨 있지, 효율이 향상된다.
단점 : 클래스 로더가 초기화, 메모리가 낭비된다.
그것은 classloder 메카니즘에 기반을 회피 동기 스레딩 그러나, 다양한 이유로 로딩 원인 클래스, 싱글 패턴 대부분 getInstance 메소드를 호출 할 수 있지만,이 클래스 로더 인스턴스화하지만 판별 할 수없는 경우 이 시간은 분명히 인스턴스 초기화 게으른 로딩 효과에 도달하지 않은 다른 방법으로 (또는 다른 정적 메서드) 클래스 로딩에 이르게있다.

코드 예제 :

공용 클래스 싱글 {  
    개인 정적 싱글 인스턴스 = 새로운 싱글 톤 ();  
    개인 싱글 () {}  
    공공 정적 싱글 톤의 getInstance () {  
    인스턴스를 반환;  
    }  
}  

4, 이중 체크 잠금 / 이중 확인 잠금 (DCL, 즉 두 번 확인 잠금입니다)

JDK 버전 : JDK1.5에서

게으른 초기화 위치 : 예

멀티 스레드 안전 : 예

어려움을 실현 : 더 복잡

설명 :이 방법은 높은 성능을 유지하는 멀티 스레딩의 경우에, 이중 잠금 메커니즘, 안전을 사용.
응용 프로그램의 getInstance () 성능이 중요합니다.

코드 예제 :

공용 클래스 싱글 {  
    개인 휘발성 정적 싱글 싱글;  
    개인 싱글 () {}  
    공공 정적 싱글 getSingleton () {  
    경우 (싱글 == NULL) {  
        동기 (Singleton.class) {  
        경우 (싱글 == NULL) {  
            싱글 톤 = 새로운 싱글 톤 ();  
        }  
        }  
    }  
    싱글을 반환;  
    }  
}  

5, 등록 유형 / 정적 내부 클래스

게으른 초기화 위치 : 예

멀티 스레드 안전 : 예

어려움을 실현 : 일반

설명 : 동일한 효과 이중 체크 잠금 모드를 달성 할 수있는 방법이 있으나 구현 쉽다.잠금 모드를 확인 정적 필드의 초기화 지연 대신 이중 이러한 방법으로 표기 사용한다. 이 내용은 정적 필드의 경우에 적용 번 확인 인스턴스 필드를 초기화하는 지연을 필요로 할 때 사용할 수있는 잠금 모드를.
이 방법은 또한 3 가지 방법으로하고, 하나의 스레드 만 인스턴스 초기화되도록 classloder 메커니즘을 이용한다 :만큼 싱글 클래스가로드 된 세 번째 방법으로, 인스턴스가 인스턴스화 (도달하지 지연로드 효과)하지만,이 방법은 예를 초기화 할 수 있고, 싱글 클래스가로드된다. SingletonHolder 클래스가 활발히 사용되지 않기 때문에, 오직 통화 getInstance 메소드를 통해 표시 인스턴스를 인스턴스화 SingletonHolder 클래스를로드 표시됩니다. 당신이 인스턴스 리소스를 많이 인스턴스화 경우, 상상, 그래서 당신이 싱글 톤 클래스 로더를 인스턴스화하지 않으려는 경우가되도록 싱글 클래스는 다른 지역에서 활성화 될 수 있도록 할 수 없기 때문에, 다른 한편으로는,로드를 지연하고 싶어 로드, 이번에는 분명히 부적절한 인스턴스를 인스턴스화합니다. 이번에는 방법의 처음 세 종류 비해 이러한 방식으로 매우 합리적이다.

코드 예제 :

공용 클래스 싱글 {  
    개인 정적 클래스 SingletonHolder {  
    개인 정적 최종 싱글 톤 인스턴스 = 새로운 싱글 톤 ();  
    }  
    개인 싱글 () {}  
    공공 정적 최종 싱글 톤의 getInstance () {  
    SingletonHolder.INSTANCE를 반환;  
    }  
}   

6, 열거

JDK 버전 : JDK1.5에서

게으른 초기화 위치 : 없음

멀티 스레드 안전 : 예

난이도를 달성 : 쉬운

설명 :이 구현은 아직 널리 사용되지 않았지만, 이것은 싱글 톤 패턴을 구현하는 가장 좋은 방법이다.절대의 여러 인스턴스를 방지하기 위해 더 간결 자동 지원 직렬화 메커니즘입니다.
이러한 접근은 효과적 자바 저작 조쉬 블로흐는 멀티 스레드 동기화 문제를 방지 할뿐만 아니라하는 방식을지지하고 있지만 자동 직렬화 절대적 다중 인스턴스를 방지하는 새로운 객체를 재 작성 방지 직렬화 메커니즘을 지원한다. 만 JDK1.5 열거 등록 후 가입 때문에, 실제로는 거의 사용되지, 도움이되지만 이상한 느낄 수있는이 방법으로 작성합니다.
반사 공격에 의해 개인 생성자를 호출 할 수 없습니다.

코드 예제 :

공공 열거 싱글 {  
    INSTANCE;  
    공공 무효 whateverMethod () {  
    }  
}  

엄지 손가락의 규칙 : 정상적인 상황에서는, 제 1 타입 및 제 2 타입 게으른 방법의 사용을 권장하지 않습니다, 세 번째 방법 배고픈 사람이 사용하는 것이 좋습니다.당신이 게으른 로딩 효과는 분명하다 구현하려는 경우에만, 우리는 등록 할 수있는 방법의 첫 번째 오가지을 사용합니다. 그것을 만들 개체를 직렬화하기 위해 오는 경우에, 당신은 여섯 번째 열거 모드를 사용하여 시도 할 수 있습니다. 다른 특별한 요구 사항이있는 경우, 당신은 제 4 번 검사를 잠금 모드를 사용하여 고려할 수 있습니다.