싱글턴 패턴은 하나의 클래스에 오직 하나의 인스턴스만 갖는 패턴이다.
예를 들어서 자바로 구현하면 다음과 같다.
public class Singleton {
// 인스턴스
private static Singleton singletonInstance = new Singleton();
// private 생성자
private Singleton(){
// 외부에서 new로 생성할 수 없도록 private로 구현
}
// 접근용
public static Singleton getSingleton(){
return singletonInstance;
}
}
특정 클래스를 static으로 최초 한번만 메모리에 할당하고, 메모리에 객체를 만들어 사용하도록 했다.
이렇게 객체를 한번 생성해두면 재 사용이 가능해서 메모리의 낭비를 방지할 수 있으며 static으로 생성해두었기에 다른 객체와의 공유에도 용이하다.
싱글톤 패턴은 TDD를 할 때 걸림돌이 된다.
단위 테스트의 경우 테스트가 서로 독립적이어야 하는건 테스트를 어떤 순서로든 실행이 되어야 하는데, 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이기에 각 테스트마다 독립적인 인스턴스를 만들기가 어렵다.
싱글톤 패턴은 사용하기 쉽지만, 모듈 간의 결합력을 강하게 만든다. 이는 객체 지향 설계 원칙중 개방-폐쇄 원칙(기존의 코드를 변경하지 않으면서(Closed), 기능을 추가할 수 있도록(Open) 설계가 되어야 한다
)에 어긋난다.
그래서 이런 경우에는 의존성 주입(Dependency Injection)을 통해서 모듈간 결합을 느슨하게 할 수 있다.
특정 인스턴스가 '직접적'으로 다른 모듈에 의존성을 주기 보다는, 중간에 의존성 주입자가 직접적으로 의존성을 주는 부분을 가로채서 인스턴스에 대해서 '간접적'으로 주입하는 방식으로 바꿀 수 있다.