클래스의 인스턴스는 오직 하나임을 보장하며, 어디서든지 이 인스턴스에 접근할 수 있는 방법을 제공하는 패턴이다.
클래스에서 만들 수 있는 인스턴스가 오직 하나이고, 이에 대한 접근을 어디에서든지 하나로만 통일하여 제공
어떤 클래스 경우에는 정확히 하나의 인스턴스만을 갖도록 하는 것이 중요하다.
- DataBase와 연결하는 connection은 여러개일 수 있지만, connection pool은 한 개
클라이언트는 Singleton 클래스에 정의된 public 오퍼레이션을 통해서 유일하게 생성되는 Singleton 인스턴스에 접근할 수 있다.
접근 제어자(private)를 통해 다른 어떤 클래스에서도 자신의 인스턴스를 추가하지 못하도록 해야한다.
고정된 메모리 영역을 사용하도록 하여, 한번만 new 연산자로 인스턴스를 얻어오기 때문에 메모리의 낭비를 줄일 수 있다.
전역변수로 선언되고, 전역 메서드로 호출하기 때문에 다른 클래스에서 사용하기 쉽다.
공통된 객체를 생성해야 하는 경우 매번 객체를 생성하지 않고, 같은 객체를 사용해 성능이 좋아진다.
가비지 컬렉팅이 되지 않기 때문에 프로그램이 종료할 때까지 메모리를 차지하게 된다.
여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안됨
싱글턴 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "OCP"을 위배하게 된다.
OCP (개방-폐쇄 원칙) : 기존에 코드를 변경하지 않고 새로운 기능을 추가할 수 있도록 설계
public class ConnectionPool {
// 인스턴스를 미리 생성해두고, static으로 공유한다
private static ConnectionPool instance = new ConnectionPool();
// 다른 클래스에서 new로 생성하는 것을 막는다
private ConnectionPool() {}
public static ConnectionPool getInstance() {
// 인스턴스가 존재하지 않는 경우만 생성하고, 존재하는 것을 반환
if(instance == null) {
instance = new ConnectionPool();
}
return instance;
}
}