프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 규약 형태로 만들어 놓은 것
자주 반복되는 설계 문제에 대한 검증된 해결 방법(설계 템플릿)
: 하나의 클래스(설계도)에 오직 하나의 인스턴스(집)만 가지는 패턴
하나의 클래스를 기반으로 단 하나의 인스턴스를 만들어, 이를 기반으로 로직을 만드는 데에 쓰임
주로 데이터베이스 연결 모듈에 쓰임
생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴함
하나의 인스턴스를 만들어놓고, 해당 인스턴스를 다른 모듈들이 공유하여 사용하기 때문에 인스턴스 생성 비용이 감소됨
모듈 간의 결합을 강하게 만들어 의존성이 높아진다는 단점이 있음 ⇒ 단위 테스트에 취약
<aside>
💡 이러한 모듈 간의 결합을 조금 느슨하게 하기 위해 의존성 주입(Dependency Injection)이라는 개념을 사용할 수 있다.
</aside>
: 객체가 직접 의존 객체를 생성하지 않고, 외부에서 주입받아 사용함으로써 결합도를 낮추는 설계 방식
<aside>
new를 안에서 하면 DI 아님
new를 밖에서 하면 DI 임
</aside>