기술나눔

싱글톤 패턴 구현

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. 소개

1.1 배경

애플리케이션이 리소스 공유를 제어하고, 구성 관리를 수행하고, 기록 작업을 기록해야 하는 경우 일반적인 요구 사항은 액세스 포인트가 어디에 있든 프로그램이 이 글로벌 액세스 포인트를 통해 액세스할 수 있도록 글로벌 액세스 포인트를 사용하는 것입니다. 관련 인스턴스 정보. 이러한 요구를 충족하기 위해 싱글톤 패턴을 사용할 수 있습니다. 싱글톤 패턴은 클래스에 인스턴스가 하나만 있도록 보장하고 해당 인스턴스에 액세스할 수 있는 전역 액세스 지점을 제공합니다.

특히 싱글톤 패턴은 일반적으로 클래스의 유일한 인스턴스를 반환하는 정적 메서드(예: getInstance())를 제공합니다. 이 메서드는 정적이므로 클래스의 인스턴스를 만들지 않고도 호출할 수 있습니다. 즉, 클래스에 액세스할 수 있는 모든 코드는 이 정적 메서드를 호출하여 싱글톤 인스턴스를 얻을 수 있습니다.

1.2 목적

이번 글에서는 싱글톤 패턴의 기본 개념과 구현 단계를 자세히 소개하겠습니다. 이 글을 통해 싱글톤 패턴이 어떻게 작동하는지 이해하고, 실제 프로젝트에서 이를 효과적으로 활용하는 방법을 배울 수 있을 것입니다.

2. 싱글톤 패턴이란 무엇입니까?

흥미로운 예를 들자면, 싱글톤 모델은 애니메이션 세계의 주인공의 후광과 같습니다. 줄거리가 어떻게 진행되든 항상 주인공은 단 한 명이며, 모두가 그가 이야기의 핵심이라는 것을 알고 있습니다. 이렇게 하면 이야기가 어떻게 전개되든 모든 사람이 같은 사람을 찾아 줄거리를 진행할 수 있습니다.

2.1 싱글톤 패턴의 장점과 단점

이점

단일 인스턴스 보장: 인스턴스 중복 생성을 방지하고 리소스를 절약합니다.
글로벌 액세스 포인트: 편리한 글로벌 접속과 단순화된 통화.
지연 초기화: 성능 향상을 위해 요청 시 인스턴스를 생성합니다.

결점

확장이 어렵다: 싱글톤 클래스는 생성자가 비공개이기 때문에 확장하기 어려운 경우가 많습니다.
잠재적인 성능 문제: 동시성이 높은 환경에서는 일부 구현에 성능 문제가 발생할 수 있습니다.
테스트의 어려움: 싱글톤 패턴은 전역 상태이므로 테스트가 어려울 수 있습니다.

2.2 싱글톤 모드의 사용 시나리오

싱글톤 패턴의 특성에 따라 사용 시나리오는 다음과 같은 범주로 나눌 수 있습니다.

  • 예를 들어 리소스 공유의 경우 구성 파일 데이터와 로그 파일을 하나의 파일에 배치할 수 있습니다. 이러한 구성 데이터나 로그 파일은 싱글톤 개체에 의해 균일하게 읽혀지고 서비스 프로세스의 다른 개체가 이 싱글톤을 전달합니다. 객체는 복잡한 환경에서 구성 관리를 단순화할 수 있는 이 구성 정보를 얻습니다.
  • 스레드 풀과 같은 리소스를 제어하는 ​​경우 다중 스레드 스레드 풀의 설계는 일반적으로 풀의 스레드 제어를 용이하게 하기 위해 싱글톤 모드를 채택합니다.

3. 싱글톤 모드의 구현 모드

싱글톤 패턴의 구현에는 일반적으로 다음 세 가지 요소가 포함됩니다.

  1. 개인 생성자, 외부에서 new 키워드를 통해 인스턴스를 생성할 수 없도록 클래스의 생성자를 비공개로 만듭니다.
  2. 자신의 인스턴스에 대한 개인 정적 참조 지점, 클래스 내부에 정적 인스턴스 변수를 생성하여 고유한 인스턴스를 저장합니다.
  3. 자체 인스턴스를 반환하는 공용 정적 메서드, 외부 세계가 이 메서드를 통해 유일한 인스턴스를 얻을 수 있도록 정적 메서드를 제공합니다.

3.1 배고픈 중국어 싱글톤 패턴

Hungry 스타일 싱글톤 모드의 경우 클래스가 로드될 때 싱글톤 인스턴스가 생성되는데, 이는 클래스가 로드될 때 정적 객체가 생성되므로 스레드로부터 안전하고 호출 시 응답 속도가 빠릅니다. 단점도 분명합니다. 클래스의 다른 정적 메서드가 실행되거나 클래스가 로드되는 한 이 인스턴스는 여전히 초기화됩니다.

/**    
 * 饿汉单例模式:在还没有实例化的时候就初始化
 */
public class Hungry {    
  	//1. 开始时就创建实例
	private static final Hungry instance=new Hungry();
	
	// 2. 私有化的构造方法
	private void hungry() {  
	}
	
	public static Hungry getInstance() { 
		// 返回单例名
		return instance;  		
	}
}