Singleton Pattern

HeeSeong·2021년 9월 8일
0

Design Pattern

목록 보기
1/4
post-thumbnail

Singleton Pattern 이란?


클래스의 인스턴스는 오직 하나임을 보장하며, 어디서든지 이 인스턴스에 접근할 수 있는 방법을 제공하는 패턴이다.


1. 사용 의도 (Intent)


  • 클래스에서 만들 수 있는 인스턴스가 오직 하나이고, 이에 대한 접근을 어디에서든지 하나로만 통일하여 제공

  • 어떤 클래스 경우에는 정확히 하나의 인스턴스만을 갖도록 하는 것이 중요하다.
    - DataBase와 연결하는 connection은 여러개일 수 있지만, connection pool은 한 개


2. 객체 협력 (collaborations)


  • 클라이언트는 Singleton 클래스에 정의된 public 오퍼레이션을 통해서 유일하게 생성되는 Singleton 인스턴스에 접근할 수 있다.

  • 접근 제어자(private)를 통해 다른 어떤 클래스에서도 자신의 인스턴스를 추가하지 못하도록 해야한다.


3. 결과 (consequence)


장점


  • 고정된 메모리 영역을 사용하도록 하여, 한번만 new 연산자로 인스턴스를 얻어오기 때문에 메모리의 낭비를 줄일 수 있다.

  • 전역변수로 선언되고, 전역 메서드로 호출하기 때문에 다른 클래스에서 사용하기 쉽다.

  • 공통된 객체를 생성해야 하는 경우 매번 객체를 생성하지 않고, 같은 객체를 사용해 성능이 좋아진다.


단점


  • 가비지 컬렉팅이 되지 않기 때문에 프로그램이 종료할 때까지 메모리를 차지하게 된다.

  • 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안됨

  • 싱글턴 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "OCP"을 위배하게 된다.

OCP (개방-폐쇄 원칙) : 기존에 코드를 변경하지 않고 새로운 기능을 추가할 수 있도록 설계


4. 예제 코드


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; 
	}
}

profile
끊임없이 성장하고 싶은 개발자

0개의 댓글