[design-patterns] 디자인 패턴 : 싱글 톤은 언제 사용해야합니까?

영광스러운 글로벌 변수-영광스러운 글로벌 클래스가됩니다. 어떤 사람들은 객체 지향 디자인을 깨뜨린다고 말합니다.

싱글 톤을 사용하는 것이 좋은 오래된 로거 이외의 시나리오를 알려주십시오.



답변

진실에 대한 나의 탐구에서 나는 싱글 톤을 사용해야하는 “허용 가능한”이유가 거의 없다는 것을 발견했다.

인터넷에서 반복해서 나타나는 경향이있는 한 가지 이유는 “로깅”클래스 때문입니다. 이 경우 로깅 클래스는 일반적으로 프로젝트의 모든 클래스에 의해 구역이 반복해서 사용해야하므로 클래스의 단일 인스턴스 대신 싱글 톤을 사용할 수 있습니다. 모든 클래스가이 로깅 클래스를 사용하면 종속성 주입이 번거로워집니다.

로깅은 코드의 실행에 영향을 미치지 않기 때문에 “허용 가능한”싱글 톤의 특정 예입니다. 로깅을 비활성화하면 코드 실행이 동일하게 유지됩니다. 동일하게 사용하십시오. Misko는 다음과 같은 방식 으로 Singletons의 근본 원인에 다음과 같이 설명합니다 . “여기의 정보는 한 방향으로 흐릅니다. 애플리케이션에서 로거로. 로거는 전역 상태이지만 로거에서 애플리케이션으로 정보가 흐르지 않기 때문에 로거가 허용됩니다.”

다른 유효한 이유도 있다고 확신합니다. ” Patterns I Hate “의 Alex Miller 는 서비스 로케이터와 클라이언트 측 UI에 대한 “허용 가능한”선택에 대해 이야기합니다.

Singleton에서 더 많은 것을 읽으십시오. 나는 당신을 사랑하지만, 당신은 나를 실망시킵니다.


답변

싱글턴 후보는 세 가지 요구 사항을 충족해야합니다.

  • 공유 리소스에 대한 동시 액세스를 제어합니다.
  • 리소스에 대한 액세스는 시스템의 여러 다른 부분에서 요청됩니다.
  • 하나의 개체 만있을 수 있습니다.

제안 된 Singleton에 이러한 요구 사항 중 하나 또는 둘만있는 경우 재 설계는 거의 항상 올바른 옵션입니다.

예를 들어, 프린터 스풀러가 두 곳 이상에서 인쇄되지 않을 경우 (인쇄 메뉴) 뮤텍스를 사용하여 동시 액세스 문제를 해결할 수 있습니다.

간단한 로거는 아마도 유효한 싱글 톤의 가장 명백한 예이지만 더 복잡한 로깅 체계로 변경 될 수 있습니다.


답변

시작시에만 읽어야 할 구성 파일을 읽고 싱글 톤으로 캡슐화합니다.


답변

공유 리소스를 관리해야 할 때 싱글 톤을 사용합니다. 예를 들어 프린터 스풀러. 동일한 자원에 대한 요청이 충돌하지 않도록하려면 애플리케이션에 스풀러 인스턴스가 하나만 있어야합니다.

또는 데이터베이스 연결 또는 파일 관리자 등


답변

일부 전역 상태 (사용자 언어, 도움말 파일 경로, 응용 프로그램 경로)를 저장하는 싱글 톤 만 읽을 수 있습니다. 비즈니스 로직을 제어하기 위해 싱글 톤을 사용하는 것에주의하십시오-싱글은 거의 항상 여러 개가됩니다


답변

데이터베이스에 대한 연결 (또는 연결 풀) 관리

또한 외부 구성 파일에서 정보를 검색하고 저장하는 데 사용합니다.


답변

싱글 톤을 사용하는 방법 중 하나는 리소스에 대한 액세스를 제어하는 ​​단일 “브로커”가 있어야하는 인스턴스를 다루는 것입니다. 싱글 톤은 로거에 적합합니다. 예를 들어 파일에 대한 액세스를 중개하여 독점적으로 만 쓸 수 있기 때문입니다. 로깅과 같은 경우에는 로그 파일과 같은 쓰기를 추상화하는 방법을 제공합니다. 캐싱 메커니즘을 싱글 톤 등으로 래핑 할 수 있습니다.

또한 창 / 스레드 등이 많은 응용 프로그램이 있지만 단일 통신 지점이 필요한 상황을 생각해보십시오. 한 번은 하나를 사용하여 응용 프로그램을 시작하려는 작업을 제어했습니다. 싱글 톤은 작업을 직렬화하고 관심있는 프로그램의 다른 부분에 상태를 표시하는 역할을 담당했습니다. 이런 종류의 시나리오에서는 싱글 톤을 응용 프로그램 내에서 실행되는 “서버”클래스와 같은 것으로 볼 수 있습니다 … HTH