싱글턴
- 인스턴스를 오직 하나만 생성할 수 있는 클래스
- 함수와 같은 stateless 객체나 시스템 컴포넌트 등
필드 방식
- 생성자를 private로 설정하여 인스턴스 생성시 단 한번만 작동하도록 함.
public class Alice {
private final String name;
public static Alice INSTANCE = new Alice();
private Alice() {
this.name = "Alice";
}
public String getName() {
return name;
}
}
public class main {
public static void main(String[] args) {
Alice alice = Alice.INSTANCE;
System.out.println("alice name = " + alice.getName());
}
}
- 권한이 있는 클라이언트에서 AccesibleObject.setAccessible 로 private를 사용해서 생성자 호출하는 경우말고는 안전.
- 방어법은 생성자에 두번째 객체 생성되려할때 예외 던지게 하기
장점
- API에 해당 클래스가 싱글턴임이 분명하게 드러남
- public static 가 final 이니 다른 객체 참조가 불가능
정적 팩터리 방식
- 인스턴스는 private로 설정하고 정적팩터리 메서드를 통해 인스턴스를 반환하도록 함.
public class AliceStaticFactory {
private final String name;
private static final AliceStaticFactory INSTANCE = new AliceStaticFactory();
private AliceStaticFactory() {
this.name = "Alice Static Factory";
}
public static AliceStaticFactory getInstance() {
return INSTANCE;
}
public String getName() {
return name;
}
}
public class main {
public static void main(String[] args) {
AliceStaticFactory aliceStaticFactory1 = AliceStaticFactory.getInstance();
AliceStaticFactory aliceStaticFactory2 = AliceStaticFactory.getInstance();
System.out.println("aliceStaticFactory1 name = " + aliceStaticFactory1.getName());
System.out.println("aliceStaticFactory2 name = " + aliceStaticFactory2.getName());
}
}
장점