Singleton Pattern : 하나의 클래스 당 오직 하나의 인스턴스 만을 가지고 작업하고 인스턴스를 제어하는 단 하나의 방법만을 제공하고자 할 때 유용하다!!!
둘 이상의 인스턴스가 생성되는 것을 막기위해 클래스의 생성자를 private으로 정의하고 그 클래스의 static 메소드를 만들어서 오직 그 메소드를 통해서만 생성자에 접근할 수 있도록 하는 것이다. 그럼 이제 클래스가 이미 인스턴스화 되어 있으면 널값을 반환하고 그렇지않으면 Spooler의 인스턴스를 반환하는 메소드를 가진 Spooler클래스를 제작해보자.
------------------------------------------------------------------------------------------------------------------------
public class PrintSpooler{
//a prototype for a spooler class
//such that only one 인스턴스 can ever exist
private static PrintSpooler spooler;
private PrintSpooler(){ //privatized
}
//return only one spooler 인스턴스
public static synchronized PrintSpooler getSpooler(){
if(spooler == null) //if none created
spooler = new PrintSpooler(); //create one
return spooler;
}
public void print(String s){
System.out.println(s);
}
}
------------------------------------------------------------------------------------------------------------------------
private으로 선언되었기 때문에 Spooler클래스의 인스턴스를 직접생성할 수 없다.
------------------------------------------------------------------------------------------------------------------------
예외 던지기-
1-----------------------------------------------------------------------------------------------------------------------
public class Spooler{
// printer스풀 클래스를 위한 원형
static boolean instance_flag=false;
public Spooler() throws SingletonException{
if(instance_flag) throw new SingletonException("Only oneallowed");
else instance_flag=true;
System.out.println("printer가 열렸습니다.");
}
}
2-----------------------------------------------------------------------------------------------------------------------
public class singleSpooler{
static public void main(String argv[]){
Spooler pr1,pr2;
// 한개의 프린터를 열것이다.
System.out.println("하나의 스풀러를 열고있습니다.");
Try{
pr1=new Spooler();
}catch(SingletonException e)System.out.println(e.getMessage());
// 다른 하나의 프린터를 열려한다. 실패할 것이다.
System.out.println("두개의 스풀러를 열려합니다.");
Try{
pr2=new Spooler();
}catch(SingletonException e)System.out.println(e.getMessage());
}
}
결과--------------------------------------------------------------------------------------------------------------------
하나의 스풀러를 열고 있습니다.
printer가 열렸습니다.
두개의 스풀러를 열려 합니다.
Only one allowed
마지막 줄에서 두개의 스풀러를 사용하려는 것에 대해 예외처리를 하였다.
------------------------------------------------------------------------------------------------------------------------
Singleton ???
1. Singleton의 상속은 기초 Singleton클래스가 인스턴트화되지 않기 때문에 어려울 것이다.
2. 하나이상의 인스턴스를 허용할 수 있도록 Singleton을 변경할 수 있다.
'Design Patterns' 카테고리의 다른 글
스트래티지 패턴 2 (Head First 파헤치기 ver.1) (0) | 2009.11.12 |
---|---|
스트래티지 패턴(Strategy Pattern) (0) | 2009.11.12 |
Observer Pattern (0) | 2009.11.11 |
생성 패턴-Factory (0) | 2009.11.11 |
패턴의 정의 JSTOM (0) | 2009.11.11 |