본문 바로가기

디자인 패턴

싱글톤 패턴(singleton pattern)

싱글톤 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글톤 패턴이라고 한다.

예를 들어 하루 방문 횟수를 세는 로직을 만들어 보자.
방문하는 url은 홈페이지 메인이 될 수 도 있고 다른 url이 될 수 도 있다. 각 url마다 방문 횟수를 체크하고 모든 url에 방문 횟수를 더해준다면 url마다 클래스를 새롭게 생성해야 하고 그 생성한 정보를 다시 계산해 줘야 한다. 만약 하나의 클래스를 다 같이 공유해서 사용한다면 ??

public class VisitCnt {
    private  int cnt = 0;
    private static VisitCnt visitCnt;
    private VisitCnt() {

    }

    public static VisitCnt getVisitCnt() {
        if(visitCnt == null) {
            visitCnt = new VisitCnt();
        }
        return visitCnt;
    }

    public void plusCnt() {
        cnt++;
    }

    public void setCnt(int cnt) {
        this.cnt = cnt;
    }

    public int getCnt() {
        return cnt;
    }
}

위에 코드는 멀티 스레드 환경과 동시성은 고려하지 않은 기본적인 싱글톤 패턴에 객체이다. 특징으로는 기본 생성자를 public이 아닌 private를 사용했고 객체를 생성하는 메서드 getVisitCnt와 필드인 visitCnt에 static을 사용했다.생성자에 private을 사용한 이유는 무분별한 인스턴스 생성을 막기 위함이고 정적 메서드 패턴을 사용해서 getVisitCnt 메서드로 인스턴스를 공유하게 설정했다.

@Slf4j
public class Client {

    public static void main(String[] args) {
        VisitCnt v= VisitCnt.getVisitCnt();
        v.plusCnt();

        VisitCnt v1 = VisitCnt.getVisitCnt();
        v1.plusCnt();

        log.info("v = {} v1 = {}", v.getCnt(), v1.getCnt());
    }
}
22:20:41.007 [main] INFO com.example.demo.design.single.Client - v = 2 v1 = 2

 


2024.06.29

싱글톤 패턴에 대한 생각

1. 단일 인스턴스 제공할 수 있는 패턴

2. 모두가 공유하는 인스턴스이기 때문에 사용할 때 더욱 신중해야 함(영향도)

3. 최근 애플리케이션에서는 메모리 사용량을 줄이기 위해 굳이 싱글톤 패턴을 사용해야 할까..??

'디자인 패턴' 카테고리의 다른 글

템플릿 메서드 패턴(Template Method)  (0) 2022.10.30
빌더 패턴(builder Pattern)  (0) 2022.07.30
추상 팩토리 패턴( Abstract Factory Pattern)  (0) 2022.07.24
팩토리 패턴  (1) 2022.07.17
데코레이터 패턴  (2) 2022.06.26