싱글톤 패턴은 인스턴스를 오직 하나만 생성하여 사용하는 디자인 패턴이다.
싱글톤 패턴을 구현하는 방법은 다음 세가지가 있다.
public class Singleton1{
public static final Singleton1 instance = new Singleton1();
private Singleton1(){}
}
→ 위 코드를 통해 클라이언트에서는 new 키워드를 쓸 수 없다. (생성자가 private이므로)
다만 자바의 reflection기능을 사용한다면 인스턴스를 얻어올 수는 있다.
1번 방법에서, 싱글톤 패턴을 적용한 객체가, 요구사항이 변경되어 싱글톤 패턴을 중단하기로 했다고 가정해보자. 이렇게 된 경우 다음과 같이 클라이언트의 코드부가 변경되어야 할 것이다.
Singleton1 singleton1 = Singleton1.instance;
-> Singleton1 singleton1 = new Singleton1();
리팩토링 수고가 많아지는 만큼, 이런 경우를 방지하기 위해 정적 팩토리메서드를 구현하여 싱글톤을 보장하는것이 추후 확장성에 좋다.
public class Singleton2{
private static final Singleton2 instance = new Singleton2();
private Singleton2(){}
public Singleton2 getInstance(){
return this.instance;
}
}
위 처럼 정적 팩토리 메소드를 선언해주게 되면 요구사항이 변경되었을때, 클라이언트의 코드부를 모두 바꾸는 것이 아닌 getInstance만 수정하게 되면 된다.
public Singleton2 getInstance(){
return new Singleton2();
}
public enum Singleton3{
INSTANCE;
public String getName(){
return "leejaebeen";
}
}
enum을 사용한다면 완벽한 싱글톤을 보장할 수 있다.
리플렉션을 할수도 없다. 다만 상속을 하지 못한다는 단점이 생기며 이는 개발자들로 하여금 부자연스러운 개발형태가 될 수도 있다.
→ 2번이 가장 이상적인것 같다...