logo

싱글톤 방법 설계 패턴

싱글톤 패턴은 아마도 가장 널리 사용되는 디자인 패턴일 것입니다. 이해하기 쉽고 사용하기 쉬운 간단한 패턴입니다. 때로는 과도하게 사용되거나 필요하지 않은 시나리오에서도 사용됩니다. 그러한 경우에는 이를 사용함으로써 얻는 이점보다 단점이 더 큽니다. 이러한 이유로 싱글톤 패턴은 때때로 안티패턴 또는 패턴 싱글톤 .

싱글톤 방법 디자인 패턴



np 어디서

싱글톤 방법 디자인 패턴에 대한 중요한 주제

1. 싱글턴 방식 디자인 패턴이란?

싱글톤 방법 또는 싱글톤 디자인 패턴은 가장 간단한 디자인 패턴 중 하나입니다. 이는 클래스에 하나의 인스턴스만 있도록 보장하고 이에 대한 전역 액세스 지점을 제공합니다.

2. 싱글턴 방식 디자인 패턴은 언제 사용하나요?

다음과 같은 경우 싱글톤 방법 디자인 패턴을 사용하십시오.



  • 클래스의 인스턴스는 정확히 하나만 있어야 하며 잘 알려진 액세스 포인트에서 클라이언트가 액세스할 수 있어야 합니다.
  • 단독 인스턴스가 서브클래싱을 통해 확장 가능해야 하고 클라이언트가 수정 없이 확장 인스턴스를 사용할 수 있어야 하는 경우
  • 싱글톤 클래스는 로깅, 드라이버 개체, 캐싱, 스레드 풀, 데이터베이스 연결에 사용됩니다.

3. 싱글톤의 초기화 유형

싱글톤 클래스는 다음 두 가지 방법으로 인스턴스화할 수 있습니다.

  • 조기 초기화 : 이 메서드에서는 클래스 사용 여부에 관계없이 클래스가 초기화됩니다. 이 방법의 가장 큰 장점은 단순성입니다. 클래스 로딩 시 클래스를 시작합니다. 단점은 클래스가 사용 여부에 관계없이 항상 초기화된다는 것입니다.
  • 지연 초기화: 이 메서드에서는 클래스가 필요할 때만 초기화됩니다. 필요하지 않을 때 클래스를 인스턴스화하지 않아도 됩니다. 일반적으로 싱글톤 클래스를 생성할 때 지연 초기화가 사용됩니다.

4. 싱글톤 방법 설계 패턴의 핵심 구성 요소:

싱글톤의 핵심 구성요소 방법 설계 패턴-(1)

java8 기능

4.1. 정적 멤버:

싱글톤 패턴 또는 싱글톤 패턴은 클래스 내에서 정적 멤버를 사용합니다. 이 정적 멤버는 Singleton 클래스의 단일 인스턴스를 유지하면서 메모리가 한 번만 할당되도록 보장합니다.



자바
// Static member to hold the single instance private static Singleton instance;>

4.2. 민간 건설자:

Singleton 패턴 또는 패턴 싱글톤에는 Singleton 클래스의 인스턴스를 생성하려는 외부 시도에 대한 바리케이드 역할을 하는 전용 생성자가 통합되어 있습니다. 이렇게 하면 클래스가 인스턴스화 프로세스를 제어할 수 있습니다.

자바
// Private constructor to // prevent external instantiation class Singleton {  // Making the constructor as Private  private Singleton()  {  // Initialization code here  } }>

4.3. 정적 팩토리 방법:

싱글톤 패턴의 중요한 측면은 정적 팩토리 메소드가 있다는 것입니다. 이 메서드는 싱글톤 개체에 대한 전역 액세스 지점을 제공하는 게이트웨이 역할을 합니다. 누군가 인스턴스를 요청하면 이 메서드는 새 인스턴스를 생성하거나(아무것도 존재하지 않는 경우) 기존 인스턴스를 호출자에게 반환합니다.

자바
// Static factory method for global access public static Singleton getInstance() {  // Check if an instance exists  if (instance == null) {  // If no instance exists, create one  instance = new Singleton();  }  // Return the existing instance  return instance; }>

5. 싱글톤 방식 디자인 패턴 구현

싱글톤 디자인 패턴 또는 패턴 싱글톤의 구현은 다음 클래스 다이어그램에 설명되어 있습니다.

스크린샷-2023-12-07-174635

싱글톤 방식 설계 패턴 구현

싱글톤 디자인 패턴의 구현은 매우 간단하며 단일 클래스로 구성됩니다. 싱글톤 인스턴스가 고유하도록 하려면 모든 싱글톤 생성자를 비공개로 설정해야 합니다. 전역 액세스는 코드에 표시된 것처럼 단일 인스턴스에 전역적으로 액세스할 수 있는 정적 메서드를 통해 수행됩니다.

자바
/*package whatever //do not write package name here */ import java.io.*; class Singleton {  // static class  private static Singleton instance;  private Singleton()  {  System.out.println('Singleton is Instantiated.');  }  public static Singleton getInstance()  {  if (instance == null)  instance = new Singleton();  return instance;  }  public static void doSomething()  {  System.out.println('Somethong is Done.');  } } class GFG {  public static void main(String[] args)  {  Singleton.getInstance().doSomething();  } }>

산출
Singleton is Instantiated. Somethong is Done.>

getInstance 메소드를 사용하여 인스턴스가 null인지 확인합니다. 인스턴스가 null이 아니면 개체가 이전에 생성되었음을 의미합니다. 그렇지 않으면 new 연산자를 사용하여 생성합니다.

6. 싱글톤 메서드 디자인 패턴을 구현하는 다양한 방법

때로는 클래스의 인스턴스가 하나만 있어야 합니다. 예를 들어 여러 객체가 공유하는 단일 DB 연결은 모든 객체에 대해 별도의 DB 연결을 생성하는 데 비용이 많이 들 수 있습니다. 마찬가지로 여러 관리자를 만드는 대신 모든 문제를 처리하는 단일 구성 관리자 또는 오류 관리자가 애플리케이션에 있을 수 있습니다.

클래식 구현

이진 트리와 이진 검색 트리의 차이점

이러한 클래스를 구현하기 위한 다양한 디자인 옵션을 살펴보겠습니다. 정적 클래스 변수와 액세스 한정자를 잘 다루면 이는 어려운 작업이 아닐 것입니다.

방법 1 – 클래식 구현 || 구현하려면 getInstance()를 정적으로 만드세요. 싱글톤 방법 설계 패턴

자바
// Classical Java implementation of singleton // design pattern class Singleton {  private static Singleton obj;  // private constructor to force use of  // getInstance() to create Singleton object  private Singleton() {}  public static Singleton getInstance()  {  if (obj == null)  obj = new Singleton();  return obj;  } }>

여기서 우리는 선언했습니다. getInstance() 클래스를 인스턴스화하지 않고도 호출할 수 있도록 static입니다. 처음으로 getInstance() 호출되면 새로운 싱글톤 객체를 생성하고 그 후에는 동일한 객체를 반환합니다.

메모: 싱글톤 obj는 우리가 필요로 하고 호출할 때까지 생성되지 않습니다. getInstance() 방법. 이를 게으른 인스턴스화라고 합니다. 위 방법의 주요 문제점은 스레드로부터 안전하지 않다는 것입니다. 다음 실행 순서를 고려하십시오.

라인 오토캐드 명령

이 실행 시퀀스는 싱글톤에 대해 두 개의 개체를 생성합니다. 따라서 이 고전적인 구현은 스레드로부터 안전하지 않습니다.

방법 2 || getInstance()를 동기화하여 구현 싱글톤 방법 설계 패턴

자바
// Thread Synchronized Java implementation of // singleton design pattern class Singleton {  private static Singleton obj;  private Singleton() {}  // Only one thread can execute this at a time  public static synchronized Singleton getInstance()  {  if (obj == null)  obj = new Singleton();  return obj;  } }>

여기에서 동기화를 사용하면 한 번에 하나의 스레드만 실행할 수 있습니다. getInstance() . 이 방법의 가장 큰 단점은 싱글톤 객체를 생성하는 동안 매번 동기화를 사용하면 비용이 많이 들고 프로그램 성능이 저하될 수 있다는 것입니다. 그러나, 만약에 성능이 getInstance() 이 방법은 깨끗하고 간단한 솔루션을 제공합니다.

방법 3 – 즉시 인스턴스화 || 싱글톤 디자인 패턴의 정적 초기화 기반 구현

자바
// Static initializer based Java implementation of // singleton design pattern class Singleton {  private static Singleton obj = new Singleton();  private Singleton() {}  public static Singleton getInstance() { return obj; } }>

여기서는 정적 초기화 프로그램에서 싱글톤 인스턴스를 만들었습니다. JVM은 클래스가 로드될 때 정적 초기화 프로그램을 실행하므로 스레드 안전성이 보장됩니다. 싱글톤 클래스가 가볍고 프로그램 실행 전체에서 사용되는 경우에만 이 방법을 사용하십시오.

방법 4 – 가장 효율적 || Double Checked Locking을 사용하여 싱글톤 디자인 패턴 구현

일단 객체가 생성되면 주의 깊게 알아차리면 이제 obj는 null이 아니며 모든 작업 순서가 일관된 결과로 이어지기 때문에 동기화는 더 이상 유용하지 않습니다. 따라서 obj가 null일 때 getInstance()에 대한 잠금을 한 번만 획득합니다. 이렇게 하면 우리가 원하는 첫 번째 방법만 동기화할 수 있습니다.

자바
// Double Checked Locking based Java implementation of // singleton design pattern class Singleton {  private static volatile Singleton obj = null;  private Singleton() {}  public static Singleton getInstance()  {  if (obj == null) {  // To make thread safe  synchronized (Singleton.class)  {  // check again as multiple threads  // can reach above step  if (obj == null)  obj = new Singleton();  }  }  return obj;  } }>

우리는 obj를 선언했습니다 휘발성 물질 이는 싱글톤 인스턴스로 초기화될 때 여러 스레드가 obj 변수를 올바르게 제공하도록 보장합니다. 이 방법을 사용하면 매번 동기화된 메서드를 호출하는 오버헤드가 크게 줄어듭니다.

7. 패턴 싱글톤 기법의 활용 사례

  • 데이터베이스 연결: 데이터베이스 연결을 생성하고 관리하는 데 비용이 많이 드는 작업인 애플리케이션에서는 싱글톤을 사용하여 애플리케이션 전체에서 단일 데이터베이스 연결을 유지할 수 있습니다.
  • 구성 관리: 애플리케이션의 다양한 구성 요소에서 액세스해야 하는 전역 구성 설정이 있는 경우 Singleton 구성 관리자는 이러한 설정에 대한 단일 액세스 지점을 제공할 수 있습니다.
  • GUI 구성요소: GUI(그래픽 사용자 인터페이스) 구성 요소 또는 컨트롤러의 경우 싱글톤은 단일 제어 지점을 제공하여 UI의 상태와 작업을 관리하는 데 도움이 될 수 있습니다.
  • 장치 관리자: 하드웨어 장치와 상호 작용하는 임베디드 시스템이나 애플리케이션에서 싱글톤을 사용하면 충돌을 피하기 위해 하드웨어 장치에 대한 액세스를 관리하고 제어할 수 있습니다.
  • 인쇄 서비스: 문서 또는 보고서 인쇄와 관련된 시스템에서 싱글톤 인쇄 서비스는 인쇄 작업을 조정 및 관리하여 인쇄 리소스를 효율적으로 사용할 수 있도록 합니다.

8. 싱글톤 방식 설계 패턴의 장점:

  • 이름 충돌 해결: 이름 지정 충돌이나 충돌을 방지하기 위해 단일 제어 지점이 필요한 시나리오에서 싱글톤 패턴은 고유한 이름을 가진 인스턴스가 하나만 있도록 보장합니다.
  • 즉시 초기화 또는 지연 초기화: 싱글톤 패턴은 즉시 초기화(클래스가 로드될 때 인스턴스 생성)와 지연 초기화(처음 요청될 때 인스턴스 생성)를 모두 지원하여 사용 사례에 따라 유연성을 제공합니다.
  • 스레드 안전성: 적절하게 구현된 싱글톤 패턴은 스레드 안전성을 제공하여 인스턴스가 원자적으로 생성되고 여러 스레드가 실수로 중복 인스턴스를 생성하지 않도록 보장할 수 있습니다.
  • 메모리 사용량 감소: 리소스 소비가 중요한 애플리케이션에서 싱글톤 패턴은 클래스 인스턴스가 하나만 있도록 보장하여 메모리 사용량을 줄이는 데 기여할 수 있습니다.

9. 싱글톤 디자인 패턴의 단점

  • 테스트 어려움: 싱글톤은 전역 상태를 도입하기 때문에 단위 테스트가 어려울 수 있습니다. 싱글톤의 상태가 테스트 결과에 영향을 미칠 수 있으므로 싱글톤에 의존하는 경우 하나의 구성 요소를 격리하여 테스트하는 것이 더 복잡할 수 있습니다.
  • 동시성 문제: 멀티스레드 환경에서는 싱글톤 인스턴스 생성 및 초기화와 관련된 문제가 발생할 수 있습니다. 여러 스레드가 동시에 싱글톤을 생성하려고 하면 경쟁 조건이 발생할 수 있습니다.
  • 제한된 확장성: 싱글톤 패턴은 코드 확장성을 떨어뜨릴 수 있습니다. 나중에 클래스의 여러 인스턴스가 필요하다고 결정하거나 인스턴스화 논리를 변경하려는 경우 상당한 리팩토링이 필요할 수 있습니다.
  • 전역 종속성: 싱글톤 패턴은 전역 종속성을 생성하므로 싱글톤을 대체 구현으로 대체하거나 인스턴스 제공을 위해 종속성 주입을 사용하기가 더 어렵습니다.
  • 하위 클래스로 분류하기 어려움: 싱글톤을 서브클래싱하는 것은 어려울 수 있습니다. 생성자는 일반적으로 비공개이므로 Singleton을 확장하려면 추가적인 주의가 필요하며 표준 상속 패턴을 따르지 않을 수 있습니다.
  • 수명주기 관리: 싱글톤 패턴은 인스턴스를 명시적으로 삭제하거나 재설정해야 하는 시나리오를 처리하지 못할 수 있습니다. 싱글톤의 수명주기 관리가 문제가 될 수 있습니다.
  • 글로벌 액세스 포인트 남용: 글로벌 액세스 포인트는 장점이기는 하지만 남용될 수도 있습니다. 개발자는 모든 작업에 싱글톤을 사용하고 싶은 유혹을 느낄 수 있으며, 이는 전역 상태를 과도하게 사용하고 덜 모듈화된 설계로 이어집니다.

10. 결론

일부 클래스에는 정확히 하나의 인스턴스가 있는 것이 중요합니다. 시스템에는 여러 개의 프린터가 있을 수 있지만 프린터 스풀러는 하나만 있어야 합니다. 파일 시스템과 창 관리자는 하나만 있어야 합니다. 디지털 필터에는 하나의 A/D 변환기가 있습니다. 회계 시스템은 한 회사에 서비스를 제공하는 데 전념합니다. 클래스에 인스턴스가 하나만 있고 해당 인스턴스에 쉽게 액세스할 수 있도록 하려면 어떻게 해야 합니까? 전역 변수를 사용하면 개체에 액세스할 수 있지만 여러 개체를 인스턴스화하는 데 방해가 되지는 않습니다.

더 나은 해결책은 클래스 자체가 유일한 인스턴스를 추적하도록 만드는 것입니다. 클래스는 다른 인스턴스가 생성되지 않도록 할 수 있으며(새 객체 생성 요청을 가로채서) 인스턴스에 액세스하는 방법을 제공할 수 있습니다. 이것이 싱글턴 패턴입니다.