본문 바로가기
Spring/DesighPattern

GOF패턴-SingleTon(생성)

by windy7271 2023. 2. 22.
728x90
반응형

객체 : 속성과 기능을 갖춘것

클래스: 속성과 기능을 정의한것

인스턴스 : 속성과 기능을 가진것중 실제하는것

 

자동차 (객체) 

설계도 (클래스) 

공장에서 만들어서 나온 자동차(인스턴스)

SingleTon:  하나만 생성해야할 객체를 위한 패턴 (Instance 생성) 

 

 

package SingleTon;

public class SystemSpeaker {

    static private SystemSpeaker instance; // 하나만 있어야하는 스피커
    private int volume;

    private SystemSpeaker() {
        volume = 5;
//        다른데서 생성 못하게 하기 위해서 private
    }
    public static SystemSpeaker getInstance() { // getinstance 를 받기 위해서 static
        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;
    }
}

 

package SingleTon;

public class Main {
    public static void main(String[] args) {
        SystemSpeaker speaker1 = SystemSpeaker.getInstance();
        SystemSpeaker speaker2 = SystemSpeaker.getInstance();

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

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

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

    }
}

 

싱글톤 패턴은 인스턴스를 한개 만들어서 다음에는 똑같은 인스턴스를 안 만들기 위해서다

 

만약 스피커가 100 개 있는데 싱글톤 패턴을 안쓰고 볼륨을 1 올리려면 100개 스피커를 1개씩 1을 올려야한다.

하지만 동일한 인스턴스이면 100개 여도 1개만 올려도 100개 다 올라간다. 동일한 인스턴스를 쓰기 때문이다

 

사용 이유는 요청마다 새로운 객체가 새롭게 생성되게 되면 메모리 성능에 대한 문제가 생기고 또한 객체를 새롭게 생성하는데

비용이 크다고 갓영한 쌤이 가르쳐주셨다 . 

 

OCP 법칙을 위반하는 경우가 생기기 때문에  public 하고 static 한 메소드를 만들어야 한다.

 

private static final Systemspeaker instance = new Systemspeaker() 대신에 

static final Systemspeaker instance; 이렇게 하고

밑에 Systemspeker getinstance 를 public 하게 열어둔다.

 

 

 

SingleTon 과 Sington Scope 

Singleton -

싱글톤: 객체를 공유한다의 의미로 받아드렸다.
만약 메인 스피커의 볼륨을 조절하는 클래스를 만들었다면, 해당 객체를 만들고 볼류을 조절해야하지만,

객체가 계속해서 만들어지면 메인스피커의 본질이 흐려진다. 메인스프커가 여러개 생성되는 것이니까.

싱글톤 을 사용하면 똑같은 인스턴스에 접근한다.

 

SingleTone Scope

클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.

  • 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다.
  • 싱글톤 빈의 하나의 공유 인스턴스만 관리한다.
    - private 생성자를 사용해서 임의로 new생성자를 사용하지 못하도록 막아야 한다.
  • 해당 bean definition과 일치하는 ID 또는 ID를 가진 빈에 대한 모든 요청은 스프링 컨테이너에서 해당 특정 빈 인스턴스를 반환한다. (스프링이 싱글톤 객체를 관리한다.)
  • 스프링 컨테이너 종료시 소멸 메서드도 자동으로 실행된다.

스프링의 기본 값으 싱글톤스코프이다.

 

출처 https://velog.io/@zion9948/%EB%B9%88%EC%8A%A4%EC%BD%94%ED%94%84%EC%A4%91-%EC%8B%B1%EA%B8%80%ED%86%A4-%EC%8A%A4%EC%BD%94%ED%94%84%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

 

반응형

댓글