Design Pattern/생성 패턴

Singleton Pattern

Singleton Pattern

어떤 클래스의 인스턴스는 오직 하나임을 보장하며, 이 인스턴스에 접근할 수 있는 전역적인 접촉점을 제공하는 패턴

 

이점

객체를 재사용하기 때문에 메모리 낭비를 방지

싱글톤으로 생성된 객체는 무조건 한번 생성으로 전역성을 띄기에 다른 객체와 공유가 용이

 

단점

싱글톤으로 만든 객체의 역할이 간단한 것이 아닌 역할이 복잡한 경우라면 해당 싱글톤 객체를 사용하는 다른 객체간의 결함도가 높아져서 객체 지향 설계 원칙에 어긋나게 된다. (개방-폐쇄)

 해당 싱글톤 객체를 수정할 경우 싱글톤 객체를 사용하는 곳에서 사이드 이팩트 발생 확률이 생기게 되며, 멀티 쓰래드환경에서 동기화 처리 문제등이 생길수 있다.

 

 

public class SingleObject {

    private static SingleObject instance = new SingleObject();

    private SingleObject() {}

    public static SingleObject getInstance() {
        return instance;
    }

    public void showMessage() {
        System.out.println("Hello");
    }
}

instance라는 전역 변수를 선언하는데 static을 줌으로써 인스턴스화 하지 않고 사용할 수 있게 하였지만 접근 제한자가 private 로 되어 있어 직접적인 접근은 불가능하게 만든다.

다만 이 경우 인스턴스를 요청이 들어오는 시점이 아닌 클래스 로딩시점에 생성되게 됨으로 필요하지 않을때도 고정된 메모리를 소모하게 되는 문제가 있다.

 

public class SingleObject {

    private static SingleObject instance;

    private SingleObject() {}

    public static synchronized SingleObject getInstance() {
        if (instance == null) {
            instance = new SingleObject();
        }
        return instance;
    }

    public void showMessage() {
        System.out.println("Hello");
    }
}

그래서 lazy 하게 값을 가져올수 있도록 요청할때 만들어서 주게 만들수있는데 이때 만약 멀티 쓰레드 환경에서 동시에 접근하는 경우 두개의 객체가 만들어질수 있는 위험이 있기 때문에 synchronized을 통해서 동기화를 적용해야한다. 

다만 synchronized로 인해서 성능이 저하된다.

 

public class SingletonPatternDemo {
    public static void main(String[] args) {
        SingleObject object = SingleObject.getInstance();
        object.showMessage();
    }
}

 

Reference

www.tutorialspoint.com/design_pattern/singleton_pattern.htm

'Design Pattern > 생성 패턴' 카테고리의 다른 글

prototype pattern  (0) 2021.04.13
Builder Pattern  (0) 2021.04.13
Abstract Factory Pattern  (0) 2021.04.12
Factory Pattern  (0) 2021.04.12