[JAVA / Design Pattern] private 생성자나 enum 자료형은 싱글턴 패턴을 따르도록 설계 하자.
싱글턴은 객체를 하나만 만들 수 있는 클래스이다. 싱글턴은 보통 유일할 수 밖에 없는 시스템 컴포넌트를 나타낸다. 창 관리자(window manager)나 파일 시스템 같은 것들이 싱글턴이다. 그런데 클래스를 싱글턴으로 만들면 클라이언트를 테스트하기가 어려워질 수가 있다. 싱글턴이 어떤 인터페이스를 구현하는 것이 아니면 가짜 구현으로 대체할 수 없기 때문이다. 보통 사람들이 쓰는 싱글턴은 대체로 이렇다 1 2 3 4 5 6 7 public class Rule3 { private static final Rule3 INSTANCE = new Rule3(); public static Rule3 getInstance() { return INSTANCE; } } Colored by Color Scripter cs Rule3의 객체를 쓰고자한다면 Rule3.getInstance()만 써주면 Rule3은 객체를 생성하지 않고 INSTANCE변수에 저장되어있는 Rule3을 반환 해주므로 메모리 낭비 없이 항상 같은객체만 생성되게 된다. (public으로 선언된 getInstance()는 정적 팩터리 메서드를 이용한 방법이다.) 하지만 주의할 것이 있는데 AccessibleObject, setAccessible 메소드의 도움을 받아 권한을 흭득한 클라이언트는 리플렉션(reflection) 기능을 통해 또 다른 객체를 만들 수 있다는 것이다. 이런 종류의 공격을 방어하고 싶다면, 두 번째 객체를 생성하라는 요청을 받으면 예외를 던지도록 수정해야한다. (생성자를 private로 해주어도 호출이 되어버린다.) 리플렉션 더 알아보기 앞서 설명한 방법들로 구현한 싱글턴 클래스를 직렬화 가능(Serializable) 클래스로 만들려면 클래스 선언에 implement