3.    The Singleton Pattern

Singleton패턴은 클래스의 생성을 촉진하기 보다 어느 정도까지는제한적이라는 성격에도 불구하고-다른 생성 패턴과 함께 분류된다.다시 말해서Singleton패턴은 하나의 클래스에 대하여 단 한 개의 인스턴스만 존재한다는 것을 보증하며,해당 인스턴스에 대한 전역적인 접근 장소를 제공하여 준다.개발자가 하나의 클래스에 대하여 단 한 개의 인스턴스만 존재한다는 것을 보장받아야 할 필요가 있는 경우에 사용된다.

 

구조

사용자 삽입 이미지

 

역할

사용자 삽입 이미지
      Singleton의 역할

Static필드로서instance가 정의 되어있고 이 필드의 타입은Singleton입니다.이 클래스의 생성자는private로되어있다. getInstance()메서드는Singleton클래스를 리턴 하며 내부에서는 최초 요청시 오직 한번만Singleton클래스의 인스턴스를 생성하여instance필드에 저장합니다.

 

의도

지정한 클래스의 인스턴스가 반드시1개만 존재하도록 하고 싶고,인스턴스가1개만 존재하는 것을 프로그램 상에서 표현하고 싶은 경우

 

적용시기

인스턴스가1개만 존재하는 것을 보증할 때.

 

효과

일반적으로Singleton패턴은 프로그램이Cache기능을 포함하고 있을 경우에 많이 사용됩니다.또 다른 사용법으로는 인스턴스 재사용이라는 측면에서 자주 사용됩니다.어떤 클래스가 비즈니스 로직를 실행시 외부에서 주어진 메서드 파라미터에만 종속적이라면 이는Singleton패턴으로 표현함이 적당합니다.우리가 일반적으로 가장Singleton패턴을 볼 수 있는 경우는 각종Data Base Connection Pooler입니다.

 

Singleton의 유의점

 

Singleton클래스의 인스턴스를 반환 받는 메서드(getInstance())는 반드시synchronized로 선언되어야 합니다.아주 단시간에 클래스를 동시에 호출했을 때2개의 인스턴스가 생성될 수 있는 여지가 있기 때문입니다.

 

예제소스

사용자 삽입 이미지

 

다음은 예제소스이다.

public class PrintSpooler {

   private static PrintSpooler spooler;

 

   private PrintSpooler() {

   }

 

   public static synchronized PrintSpooler getSpooler() {

       if (spooler == null)

           spooler = new PrintSpooler();

       return spooler;

   }

 

   public void print(String s) {

       System.out.println(s);

   }

}

 

public class mainClass {

   public void exec() {

       PrintSpooler spl = PrintSpooler.getSpooler ();

       spl.print ("프린트를 기동했습니다.");

   }

   public static void main(String argv[]) {

       mainClass mainclass = new mainClass();

       mainclass.exec();

   }

}

 

관련패턴

사용자 삽입 이미지
      Abstract Factory

사용자 삽입 이미지
      Builder

사용자 삽입 이미지
      Façade

사용자 삽입 이미지
      Prototype


Posted by 영웅기삼
,