싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴이다.
코드 내 어디서든, 오직 하나의 인스턴스만 사용할 수 있도록 객체를 생성하는 방법이다.
즉 객체는 여러 번 생성되지 않고, 최초 하나의(Single) 인스턴스만 생성하고, 이후에는 이 인스턴스를 참조하게 된다.
전역적으로 하나의 인스턴스만 사용, 참조해야하는 경우에 사용한다.
하나의 인스턴스를 사용 -> 메모리 낭비를 방지할 수 있음
전역 인스턴스 -> 다른 클래스의 인스턴스들이 데이터를 공유
싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우,
SOLID 원칙 중 SRP, OCP 원칙에 위배됨.
즉, 수정과 테스트가 어려워짐
꼭 필요한 경우아니면 지양해야 함
공통된 객체를 여러 개 생성해서 사용해야하는 상황
전역에서 사용될 하나의 객체를 만들어야하는 상황(시스템 전역의 로깅을 담당하는 로거)
DB 커넥션과 Pool 을 담당하는 인스턴스
# 보통, 싱글톤 객체의 .get_instance() 로 인스턴스를 받아온다.
singleton_1 = Singleton.get_instance()
singleton_2 = Singleton.get_instance()
# 이렇게 받아온 두 인스턴스는 동일한 인스턴스다.
singleton_1 == singleton_2 # True
기존의 인스턴스를 그대로 복제(clone) 하여 새로운 객체를 생성하는 방법이다.
즉, 하나의 인스턴스를 사용하는 싱글톤과는 반대되는 개념이다.
DB 로부터 얻어온 데이터 인스턴스를 동일하게 하나 더 만들어야 하는 경우 (DB 에 연결하는 것 보다 이렇게 코드로 처리 하는게 일반적으로 cost 가 더 저렴하다.)
# 보통, 프로토타입 객체의 .clone() 으로 인스턴스를 복사한다.
original = Prototype()
prototype = original.clone()
# 이렇게 받아온 두 인스턴스는 동일한 객체는 아니지만, 내부 데이터는 같다.
original == prototype # False
original.data == prototype.data # True
인스턴스를 만들어내는 공장(Factory) 를 통해 객체를 생성하는 방법이다.
즉, 인스턴스를 직접 생성해내지 않고, 공장에서 제공하는 메쏘드를 통해 생성해낸다.
사용자는 객체를 생성하고 싶을 때, 공장에서 제공하는 메쏘드만 알고있으면 된다.
그 외 구체적으로 인스턴스가 어떻게 생성되는지 몰라도 된다.
한 집합 내에 있는 클래스들의 생성을 한 곳에서 처리하고 싶을 때 사용한다.
개념 상 같은 분류의 클래스들의 생성을 모아서 처리하는게 편할 때
공장을 만들어내는 상위 공장을 먼저 정의하고, 여기서 구체적인 공장을 만든 후, 이 공장에서 객체를 생성하는 방법이다.
즉, 팩토리의 위에 이 팩토리를 만드는 팩토리가 있다고 생각하면 된다.
추상 팩토리 메쏘드는, 기존 팩토리 메쏘드 방식에서
팩토리의 상위 팩토리를 통해 구체적인 팩토리를 생성한다.
그 외 특징은 팩토리 패턴과 같다.
객체를 생성할 때 필요한 파라미터가 많은 경우, 각 파라미터가 무엇을 의미하는지 알기 힘들 수 있다.
이럴 때, 빌더라는 형태를 통해 파라미터 의미를 명확히하여 생성할 수 있다.
빌더 패턴은 생성 인자가 많을 시,
빌더 객체를 통해 구체적인 객체를 생성한다.