Singleton Pattern
- 유일한 시스템 컴 포넌트를 선언
1. 드래코니언 동기화
- 성능적으로 이슈
- 멀티쓰레드 이슈
2. 더블 락킹 (Double Locking)
- 성능적으로 이슈 (1.5이하에서 사용)
3. Singleton Holder
- 1.5 이상.
4. 한정적 메모리의 Singleton - WeakReference
- VM이 한정적일때 사용
- 가비지 콜렉터의 대상이 됨.
5. Enum을 이용한 생성 (가장 추천)
- enum Singleton {
- // Thread Safe 하다. 하나만 있음을 보장한다.
- // Serialization 에서도 안전하다.
- // Reflection 에 대해서도 보장한다.
- // - Effective Java 에 소개.
- // - 유럽에서 사용한다.
- // - 많이 알려지지 않았지만 Java언어에서 보장하는 좋은 방법
- INSTANCE;
- public Singleton getInstance() {
- return INSTANCE;
- }
- }
- // Singleton
- // 유일한 시스템 컴포넌트를 설계할 때 사용.
- class CursorOld {
- // DCL.
- private static volatile CursorOld INSTANCE = null; // 두개이상 존재 가능성이 있으므로 volatile 선언
- private CursorOld() {
- }
- // public static Cursor getInstance() {
- // 1. Draconian 동기화 // 성능적으로 이슈가 있다.
- // public static synchronized Cursor getInstance() {
- // 2. Double checked locking
- // 성능적으로 떨어짐 (1.5 이하)
- public static CursorOld getInstance() {
- if (INSTANCE == null) {
- // 멀티쓰레드 안정성이 없다.
- synchronized (CursorOld.class) { //성능 이슈를 발생
- if (INSTANCE == null) {
- INSTANCE = new CursorOld();
- }
- }
- }
- return INSTANCE;
- }
- }
- // 사용되지 않을 수도 있다. 시작부터 끝까지 존재한다.
- // lazy initialize 가 필요할 수도있다. 성능적으로 도움
- // for jdk 1.5 이상.
- class Cursor {
- // 만들면서 초기화.
- public static final Cursor INSTANCE = new Cursor();
- // 1. public
- private Cursor() {
- }
- // 2. static factory method
- public static Cursor getInstance() { // 메소드로 접근해도 느리지 않다.
- return INSTANCE;
- }
- }
- // Initialization On Demand Holder Idiom
- // lazy initialize.
- class SingletonHolder {
- private SingletonHolder() {
- }
- private static class SingleHolder {
- private static final SingletonHolder INSTANCE = new SingletonHolder();
- }
- // 내부적으로 인스턴스가 호출될때 처음 접근, 그때 생성을 보장
- public static SingletonHolder getInstance() {
- return SingleHolder.INSTANCE;
- }
- }
- // weak reference를 통한 해제 가능한 Singleton
- // JavaVM이 한정된 메모리를 가지고 있을 때 유용하다.
- //메모리 부족시 지웠다가 없으면 다시 생성
- // for android
- class Singleton {
- static private WeakReference<Singleton> singleton;
- public Singleton getInstance() {
- Singleton m = singleton.get();
- if(m != null) {
- return m;
- }
- synchronized (Singleton.class) {
- m = singleton.get();
- if(m != null) {
- return m;
- }
- m = new Singleton();
- singleton = new WeakReference<Singleton>(m);
- }
- return m;
- }
- }
'java > design_pattern' 카테고리의 다른 글
Template Method Pattern (0) | 2014.06.27 |
---|---|
Adapter 패턴 (0) | 2014.06.27 |
Design Pattern 기본 원칙 (0) | 2014.06.18 |
Builder Pattern (0) | 2014.06.17 |
Java Beans Pattern (0) | 2014.06.17 |