92. 디자인 패턴/생성(Creational)

02. 자바 싱글톤 패턴 (JAVA Singleton Pattern)

THE HEYDAZE 2020. 6. 22. 03:44

# 참고한 영상
 

자바 디자인 패턴 이해 - YouTube

Gof Design Pattern을 자바 언어로 설명한 강의. 의미 있고 쉬운 예제를 준비하려고 노력했습니다. '좋아요'/'구독' 부탁 드립니다.

www.youtube.com

 

# 설명

전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하며,

생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴

 

하나의 인스턴스만을 생성하는 책임이 있으며.

 getInstance 메서드를 통해 모든 클라이언트에게 

동일한 인스턴스를 반환하는 작업을 수행한다.

 

# 장점

객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나

 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.

 

# 단점

전역 인스턴스이기 때문에 값 변경 시 유의해야한다.

 

# 사용 여부

3개의 제품을 연결하여도,

출력 되는 통로를 하나로 만들어 놓은다면,

선택한 제품 또는 가장 처리속도가 빠른 제품만 

출력하게끔 할 수 있다.

 

# 사용 방법
# 구조

thread safe, serialize

 

# 요구 사항
# 변경 사항
# 결과

DCL

이미지 클릭

 

LazyHodler

이미지 클릭

 

Enum

이미지 클릭

 

# 1-1 Double Checked Locking Singleton Pattern (DCL Pattern)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/** Double Checked Locking (DCL) Singleton Pattern */
public final class DCLSingleton {
 
    private String name = "DCL";
 
    private static volatile DCLSingleton instance;
 
    private DCLSingleton() {}
 
    public static DCLSingleton getInstance() {
        if (instance == null) {
            synchronized (DCLSingleton.class) {
                if (instance == null) {
                    instance = new DCLSingleton();
                }
            }
        }
        return instance;
    }
 
    public String getName() {
        return name;
    }
}
 
cs

 

# 1-2 DCL Pattern Client
1
2
3
4
5
6
7
8
9
10
11
public class Client {
 
    public static void main(String[] args) {
 
        DCLSingleton singleton = DCLSingleton.getInstance();
 
        System.out.println(singleton.getName());
 
    }
}
 
cs

 

# 2-1 LazyHolder Singleton Pattern
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/** LazyHolder Singleton Pattern */
public class LazyHolderSingleton {
 
    private String name = "Lazy";
 
    private LazyHolderSingleton() {}
 
    private static class SingletonHolder {
        private static final LazyHolderSingleton INSTANCE = new LazyHolderSingleton();
    }
 
    public static LazyHolderSingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
 
    public String getName() {
        return name;
    }
}
 
cs

 

# 2-2 LazyHolder Pattern Client
1
2
3
4
5
6
7
8
9
10
11
public class Client {
 
    public static void main(String[] args) {
 
        LazyHolderSingleton singleton = LazyHolderSingleton.getInstance();
 
        System.out.println(singleton.getName());
 
    }
}
 
cs

 

# 3-1 Enum Singleton Pattern
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/** Enum Singleton pattern */
public enum EnumSingleton {
 
    INSTANCE;
 
    String name;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}
 
cs

 

# 3-2 Enum Pattern Client
1
2
3
4
5
6
7
8
9
10
11
public class Client {
    
    public static void main(String[] args) throws InterruptedException {
 
        EnumSingleton singleton = EnumSingleton.INSTANCE;
 
        System.out.println(singleton.getName());
 
    }
}
 
cs

 

# Diagram

 

# 참고 사이트

[출처] https://medium.com/@joongwon/multi-thread-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C%EC%9D%98-%EC%98%AC%EB%B0%94%EB%A5%B8-singleton-578d9511fd42

# 추가 참고 사이트
 

[Design Pattern] 싱글턴 패턴이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io