JAVA2010. 5. 20. 16:19

원본 - java 로 배우는 디자인 패턴 입문

Singleton 패턴
# 하나의 인스턴스만 생성되어야 하는 클래스 구현 패턴

# 사용 목적
프로그램 실행 시 하나의 클래스에 대한 인스턴스가 보통 여러 개 생성 및 사용 된다.하지만 반드시 하나의 인스턴스만 생성되어야 하는 클래스도 있다.
(예: 컴퓨터 자체를 표현한 클래스, 윈도 시스템을 표현한 클래스 등)

일반적으로 인스턴스 생성시 new MyClass( )를 한번만 실행하면 된다.
그러나, 1개의 인스턴스만 생성되도록 프로그램에 표현하고 싶을 때 Singleton 패턴을 사용한다.

# 규칙
private 맴버 변수
private 생성자
public 호출자

# 간단한 예제

## Main.calss
## Singleton Class 의 인스턴스를 호출하여 동일한 객체인지 유무 확인

package singleton;

public class Main {
 
 /**
  * main method
  * @param args
  */
 public static void main(String[] args) {
  
  Singleton obj1 = Singleton.getInstance();
  Singleton obj2 = Singleton.getInstance();
  
  if(obj1 == obj2) {
   System.out.println("같은 객체");
  } else {
   System.out.println("다른 객체");
  }
 }
}


## Singleton.class
## 1. private 맴버변수 선언
## 2. private 생성자 선언
## 3. public get 호출자 선언
## static 으로 선언하여 VM에서 전역 변수로 사용
## private 변수와 생성자를 사용하여 외부에서 변경 못하도록 지정.

package singleton;

public class Singleton {

 private static Singleton instance;

 /*
  * 정적 필드 - 최초 로드 시 한번만 초기화를 한다.
  */
 static {
  instance = new Singleton();
 }
 

 /**
  * 생성자
  */
 private Singleton() {
  
 }
 
 
 /**
  * get property
  */
 public static Singleton getInstance() {
  return instance;
 }
 
}

## 실행 결과 : 같은 객체

# 한정자가 필요한 이유
인스턴스가 하나만 존재한다는 것이 보증되면, 인스턴스 상호 간에 영향을 주어 생각지 못한 버그가 발생할 가능성이 없어진다.

# 유일한 하나의 인스턴스는 언제 생성되는가
프로그램 실행 후, 처음으로 Singleton.getInstance( ) 메소드가 호출되면, Singleton 클래스가 초기화되고, 이 때 static 필드인 singleton 필드가 초기화된다.

* synchronized

Posted by Tiwaz