Java 디자인 모드의 단일 모드(Singleton 모드) 소개

정의: Singleton 모드의 주요 역할은 자바 응용 프로그램에서 하나의 클래스가 하나의 실례만 존재하는 것을 확보하는 것이다.
많은 작업 중, 예를 들어 디렉터리 데이터베이스 연결을 구축하려면 이런 단일 루틴 작업이 필요하다.
그리고singleton은 상태화될 수 있다.이렇게 하면 여러 개의 단일 클래스가 함께 있으면 하나의 상태 창고처럼 외부에 서비스를 제공할 수 있다. 예를 들어 포럼에 있는 게시물 계수기를 원한다면 한 번 훑어볼 때마다 계수가 필요하다. 단일 클래스가 이 계수를 유지할 수 있는지, 그리고synchronize의 안전에 자동으로 1을 추가할 수 있다. 만약에 이 숫자를 데이터베이스에 영구적으로 저장하려면 단일 인터페이스를 수정하지 않는 상황에서 편리하게 할 수 있다.
한편 싱글톤도 무상태화될 수 있다.도구적 기능을 제공하고,
Singleton 모드는 우리에게 이렇게 실현될 가능성을 제공했다.Singleton을 사용하는 장점은 메모리를 절약할 수 있다는 것이다. 왜냐하면 실례의 개수를 제한하고 자바 쓰레기 회수 (garbagecollection) 에 유리하기 때문이다.
우리는 공장 모드에서 클래스 로더(classloader)에서도 Singleton 모드로 이루어지는 것을 자주 볼 수 있다. 왜냐하면 불러오는 클래스도 실제적으로 자원에 속하기 때문이다.
어떻게 단례 모드를 사용합니까
일반적인 Singleton 모드는 일반적으로 몇 가지 형식이 있습니다.

public class Singleton {
    private Singleton(){}
 // , ?
 // private
 private static Singleton instance = new Singleton();
 // class ,   
 public static Singleton getInstance() {
  return instance;   
 }
}
두 번째 형식:

public class Singleton {
 private static Singleton instance = null;
 public static synchronized Singleton getInstance() {
     // , ,      
     // , !
     if (instance==null)
      instance=new Singleton();
  return instance;
    }
}
Singleton을 사용합니다.getInstance()는 단일 상태 클래스에 액세스할 수 있습니다.
위의 두 번째 형식은 lazy initialization이다. 즉, 첫 번째 호출 때 처음에 Singleton을 사용했기 때문에 이후에 다시 생성할 필요가 없다.
lazy initialization 형식의synchronized를 주의하십시오. 이synchronized는 매우 중요합니다. 만약synchronized가 없다면 get Instance () 를 사용하면 여러 개의 Singleton 실례를 얻을 수 있습니다.lazy initialization의 Singleton에 대해double-checked locking(DCL)과 관련된 토론이 많기 때문에 흥미로운 사람들은 더욱 연구한다.
일반적으로 첫 번째 형식은 좀 더 안전하다고 생각한다.
사용 사례 모드 고려 사항
때때로 어떤 상황에서 Singleton을 사용하면 Singleton의 목적에 도달할 수 없다. 만약에 여러 개의 Singleton 대상이 서로 다른 클래스 인코더에 동시에 불러온다면.EJB와 같은 분산 시스템에서 사용해도 이런 상황을 주의해야 한다. 왜냐하면 EJB는 크로스 서버이고 JVM이기 때문이다.
SUN사의 애완동물 매장 원본 코드(Pet Store 1.3.1)의 Service Locator를 예로 들어보겠습니다.
Pet Store에서 Service Locator는 두 가지가 있는데 하나는 EJB 디렉터리 아래입니다.하나는 WEB 디렉터리에서 이 두 서비스 Locator를 검사하면 내용 차이가 많지 않고 모두 EJB의 조회 포지셔닝 서비스를 제공하는 것을 발견할 수 있습니다. 그런데 왜 분리해야 합니까?이 두 가지 Service Locator에 대해 자세히 연구한 결과 차이점을 발견했다. WEB에서의 Service Locator는 Singleton 모델을 채택하고 Service Locator는 자원 포지셔닝에 속하기 때문에 당연히 Singleton 모델을 사용해야 한다.그러나 EJB에서 Singleton 모드는 이미 작용을 잃었기 때문에 Service Locator는 두 가지로 나뉘는데 하나는 WEB를 위한 것이고 하나는 EJB를 위한 것이다.
Singleton 모드는 보기에는 간단하고 사용 방법도 편리하지만 진정으로 사용하기는 매우 쉽지 않기 때문에 자바의 클래스 메모리 등 개념에 대해 상당히 이해해야 한다.

좋은 웹페이지 즐겨찾기