1. 싱글턴 패턴의 목적
클래스가 한 개의 인스턴스만을 만들 수 있도록 하고, 다른 곳에서 그 생성된 한개의 인스턴스에 접근할 수 있도록 한다.
2. 고전적 싱글턴 패턴의 구현 방법
- private 디폴트 생성자 구현
- 싱글턴 인스턴스를 저장하는 정적 멤버 변수(static 변수) 생성
- 싱글턴 인스턴스를 반환하는 정적 팩토리 메소드(static 메소드) 구현
- (그러나 멀티 스레드를 사용하는 프로그램에서는 이게 문제가 될 수 있다.)
즉 A a = new A(); 같은 형식으로 객체를 생성하지 않게 할 것이라는 뜻이다. 여기서는 한개의 인스턴스만을 만드는 것이 목적이기 때문이다. 그러므로 private 디폴트 생성자를 막아둔다.
정적 메소드(static 메소드)에는 객체를 생성하지 않아도 사용할 수 있는 메소드가 정의되어야한다. 그래야 그 안에서 객체를 하나 생성하고 그걸 반환해주는게 가능해진다. 정적 메소드는 정적 멤버변수를 사용할 수 밖에 없다. 또한 일반 변수를 정적 팩토리 메소드에서 사용할 수 없다. 즉 일반 객체의 멤버 변수를 사용할 수 없다.
정적 멤버변수(static 메소드)에는 정적 메소드에서 생성된 한개의 객체를 저장한다.
3. 구현법
public class Singleton {
//Singleton 클래스의 유일한 인스턴스를 저장한다.
//정적 멤버변수가 자기자신을 가르키는데 주소값을 담는 개념이기 때문에 얘의 메모리 공간은 주소값이다.
//공간의 크기가 미리 정해진다.
private static Singleton uniqueInstance;
//기타 멤버변수가 필요하다면 삽입
//private 디폴트 생성자가 바깥에서 사용될 수 없도록 막는다.
private Singleton(){}
public static Singleton getInstance(){
if(uniqueInstance == null) {
//null인지 아닌지 확인하고 null이라면 이제 Singleton이라는 객체의 주소를 가진다.
//이 방법이 내부적으로 객체를 생성하는 방법이다.
//uniqueInstance 에 초기값이 주어지지않으면 null이나 0이 들어가 있다.
//이 static 메소드는 Singleton이 생성되지 않아도 사용이 가능하다.
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
위 코드에서 볼 수 있듯이 Singleton getInstance에서 초기 uniqueInstanced은 null이기 때문에 uniqueInstance 에 Singelton이라는 객체의 주소가 들어가게 된다.
그 이후로 다른 곳에서 Singleton S = Singleton.getInstance()를 하게 된다면 이미 uniqueInstance가 null이 아니기 때문에 기존에 생성 되었던 uniqueInstance가 리턴 되게 된다. 그러므로 이 방법을 쓰면 Singleton.getInstance()를 했을 때 반환하는 Instance가 같아 싱글턴 패턴의 목적을 달성한다.
'디자인 패턴 DesignPattern' 카테고리의 다른 글
스테이트 패턴(State Pattern) (0) | 2020.12.08 |
---|---|
Template Method Pattern : 템플릿 메소드 패턴 (0) | 2020.11.25 |
댓글