아무거나

[Design Pattern] Singleton Pattern 본문

Java/Java

[Design Pattern] Singleton Pattern

전봉근 2019. 12. 7. 16:27
반응형

싱글톤 패턴(Singleton Pattern)

하나의 인스턴스생성하도록 구현 즉, 인스턴스를 하나만 생성해야할 객체를 위한 패턴

싱글톤 패턴 예시 - 1

[요구사항]

  • 개발중인 시스템에서 스피커에 접근할 수 있는 클래스를 만들자.

만약 스피커에 접근할 수 있는 클래스가 하나 이상 예를 들어 100개라고 생각하면 스피커의 볼륨을 올린다면 100개의 클래스를 모두 찾아다니면서 올려줘야 하므로 개발의 복잡도도 올라가고 리소스도 많이 잡아먹는다 그러므로 싱글톤을 사용해야 한다.

스피커에 대한 싱글톤 패턴을 구현하자. [SystemSpeaker.java]

package com.bkjeon.singleton;

public class SystemSpeaker {
    // 외부에 접근 안되고 하나만 하기 위해서 static
    static private SystemSpeaker instance;

    private int volume;

    // 외부에서 생성하지 않게 하기위해서 private
    private SystemSpeaker() {
        volume = 5;
    }

    // getInstance를 받기위해서 static으로 해야한다. -> 즉 getInstance는 생성이 안되있기 때문
    public static SystemSpeaker getInstance() {
        // 인스턴스 유무 확인 조건
        if (instance == null) {
            // 시스템 스피커
            instance = new SystemSpeaker();
        }

        return instance;
    }

    public int getVolume() {
        return volume;
    }

    public void setVolume(int volume) {
        this.volume = volume;
    }
}

Main 클래스를 실행해보면 동일한 인스턴스인지 확인할 수 있다. [Main.java]

package com.bkjeon.singleton;

public class Main {

    public static void main(String[] args) {
        // 정말 하나의 리소스만 접근하는지 2개로 확인해본다.
        SystemSpeaker speaker1 = SystemSpeaker.getInstance();
        SystemSpeaker speaker2 = SystemSpeaker.getInstance();

        // 5, 5
        System.out.println(speaker1.getVolume());
        System.out.println(speaker2.getVolume());

        speaker1.setVolume(11);
        // 11, 11
        System.out.println(speaker1.getVolume());
        System.out.println(speaker2.getVolume());

        speaker1.setVolume(22);
        System.out.println(speaker1.getVolume());
        System.out.println(speaker2.getVolume());


    }

}

실행결과

5
5
11
11
22
22

싱글톤 패턴 예시 - 2

  • 인스턴스를 호출 할 때 로그를 찍어주는 소스를 추가 [SystemSpeaker.java]
package com.bkjeon.singleton;

public class SystemSpeaker {
    // 외부에 접근 안되고 하나만 하기 위해서 static
    static private SystemSpeaker instance;

    private int volume;

    // 외부에서 생성하지 않게 하기위해서 private
    private SystemSpeaker() {
        volume = 5;
    }

    // getInstance를 받기위해서 static으로 해야한다. -> 즉 getInstance는 생성이 안되있기 때문
    public static SystemSpeaker getInstance() {
        // 인스턴스 유무 확인 조건
        if (instance == null) {
            // 시스템 스피커
            instance = new SystemSpeaker();
            System.out.println("새로 생성");
        } else {
            System.out.println("이미 생성");
        }

        return instance;
    }

    public int getVolume() {
        return volume;
    }

    public void setVolume(int volume) {
        this.volume = volume;
    }
}

결과

새로 생성
이미 생성
5
5
11
11
22
22

 

참고: https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard

반응형

'Java > Java' 카테고리의 다른 글

[Design Pattern] Builder Pattern  (0) 2019.12.08
[Design Pattern] Prototype Pattern  (0) 2019.12.08
[Design Pattern] Factory Method Pattern  (0) 2019.12.07
[Design Pattern] Template Method Pattern  (0) 2019.12.07
[Design Pattern] Strategy Pattern  (0) 2019.12.07
Comments