[디자인 패턴] Singleton Pattern

do_large·2021년 11월 28일
1

패턴

목록 보기
1/2

Singleton is a creational design pattern that lets you ensure that a class has only one instance, while providing a global access point to this instance.

Intent

  • 인스턴스가 오직 1개만 생성되어야 하는 경우에 사용되는 패턴
  • 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다. 데이터를 어디서든 접근할수있도록 설계
  • 예를들어 설정파일의 경우, 객체가 여러개 생성되면 설정값이 변경될 위험이 생길수도 있다.
    인스턴스가 1개만 생성되는 싱글톤패턴을 사용하면 하나의 인스턴스를 메모리에 등록해서 여러 스레드가 동시에 해당 인스턴스를 공유하여 사용하게끔 할수있다.
  • 주의할점은 싱글턴을 만들때 동시성 문제를 고려해서 싱글턴을 설계해야한다. (멀티스레드환경을 말하는듯?)

Problem

  • 싱글톤 패턴은 2가지문제를 동시에해결한다.

AS-IS
db같은 일부 공유 리소스에 대해 엑세스를 제어하기위해서는 클래스의 인스턴스 수를 통제할 필요가있다.

  • 클래스가 하나의 싱글 인스턴스를 가지는것을 보장함
  • 공유된 데이터에 대해 관리하기 용이함. 객체를 생성할 경우 생성자를 호출할때마다 새로운 객체가 생성되지않고, 이미 존재하는 객체를 반환할수있다.

AS-IS
글로벌 변수는 중요한데이터를 담고있을수도있는데, 이것들에 대해 전역적으로 접근이 가능하면 데이터관리의 위험성이 따른다.

  • 싱글톤 패턴은 전역적으로 접근은 가능하게하면서, 인스턴스를 다른 코드에의해 overwritten 될 위험으로부터 보호한다.
  • 그리고 특정 문제를 해결하는 코드가 프로그럼 곳곳에 뿌려지는것을 원하지않을것이다. 싱글톤패턴에서는 문제해결을 위한 코드를 한곳에서 관리할수있다.

Solution

  1. 싱글톤 클래스가 new 와 함께 호출되는것을 막기위해서 constructor를 private으로 만들어라
  2. constructor처럼 행동하는 static 생성 메서드를 만들어라. 이러한 방식을 통해 이 메서드는 객체를 생성하고, 생성된 객체를 static 필드에 저장하기위해 private constructor를 호출할것이다. static 생성 메서드를 호출하면 캐싱된 객체를 반환한다.

Structure

  • 전역에서 접근 가능하고 처음 사용시 초기화 되는 (lazy initialization) 인스턴스의 클래스를 만들어라
  • 싱글 인스턴스는 private static attribute이다. 접근자함수는 public static 메서드이다.

예시코드


싱글톤이 객체지향의 의도와 맞지않는다

싱글톤은 글로벌 state를 만들수있기때문에 바람직한 방법은 아니다.

아무 객체나 자유롭게 접근하고 수정하고, 공유할 수 있는 전역상태를 갖는것은 객체지향 프로그래밍에서는 지향되어야할 모델이다.

리팩토링에서의 영향도는 프로그램 전체가 된다.

단점

  • 싱글톤 인스턴스가 너무 많은일을하거나, 많은 데이터를 공유시킬 경우에는 다른 클래스의 인스턴스들 간의 결합도가 높아져 "단일책임원칙"을 위배하게 된다. 단일 책임 원칙이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. 이는 객체지향설계원칙에 어긋난다.
  • 그래서 수정이 어려워지고, 테스트하기 어려워진다.

0개의 댓글