싱글톤 패턴은 인스턴스를 오직 하나만 생성하여 사용하는 디자인 패턴이다.

싱글톤 패턴을 구현하는 방법은 다음 세가지가 있다.

1. public static final

public class Singleton1{
	public static final Singleton1 instance = new Singleton1();
	private Singleton1(){}
}

→ 위 코드를 통해 클라이언트에서는 new 키워드를 쓸 수 없다. (생성자가 private이므로)

다만 자바의 reflection기능을 사용한다면 인스턴스를 얻어올 수는 있다.

2. private static final

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();
}

3. Enum의 활용

public enum Singleton3{
	INSTANCE;
	public String getName(){
		return "leejaebeen";
	}
}

enum을 사용한다면 완벽한 싱글톤을 보장할 수 있다.

리플렉션을 할수도 없다. 다만 상속을 하지 못한다는 단점이 생기며 이는 개발자들로 하여금 부자연스러운 개발형태가 될 수도 있다.

→ 2번이 가장 이상적인것 같다...