Суббота, 14 декабря 2019

c# 싱글톤 예제

300

Singleton 패턴의 위의 C# 구현은 게으른 초기화도 제공합니다. 따라서 인스턴스 속성에 대한 첫 번째 호출이 이루어질 때마다 실제 Singleton 인스턴스가 초기화됩니다. 필요한 경우가 아니면 Singleton은 메모리에 인스턴스가 없습니다. 제네릭 형식은 인스턴스화될 때 CLR 내부에서 재화되므로 참조되는 각 Singleton에 대해 별도의 정적 저장소가 유지관리됩니다. 싱글톤은 싱글톤과는 별도의 정적 저장 공간입니다. 이렇게 하면 인스턴스를 일반 클래스에 간단한 정적으로 저장할 수 있습니다(이국적인 것과는 대조적). Singleton은 개체의 단일 인스턴스를 만들고 해당 인스턴스를 필요로 하는 모든 사용자와 공유할 수 있는 창작 디자인 패턴입니다. 싱글톤 패턴은 코드 냄새를 내므로 권장되지 않는다는 공통된 의견이 있지만 완벽하게 맞는 경우도 있습니다. 언제든지 응용 프로그램은 Singleton 형식의 인스턴스를 하나만 보유해야 합니다. 따라서 이를 달성하기 위해 형식의 생성자가 개인 멤버로 표시해야 하며 메서드 또는 속성은 Singleton 인스턴스를 제공하기 위해 외부 세계에 노출되어야 합니다. 우리는 싱글 톤 패턴이 그다지 평가되지 는 않지만 경우에 따라 도움이 될 수 있음을 보았습니다. 그래서, 우리가 그것을 사용할 것인지 여부를 결정하는 것은 항상 우리에게 달려 있습니다. 결론은 우리가 우리의 프로젝트에 싱글 톤 패턴을 적용해야하는 경우, 이것은 그것을 할 수있는 좋은 방법입니다.

당신이 볼 수 있듯이, 이것은 정말 매우 간단합니다 — 그러나 왜 스레드 안전하고 얼마나 게으른가? C#의 정적 생성자는 클래스의 인스턴스가 만들어지거나 정적 멤버가 참조될 때만 실행되고 AppDomain당 한 번만 실행하도록 지정됩니다. 새로 생성되는 형식에 대한 이 검사를 실행해야 한다는 점을 감안할 때 이전 예제와 같이 추가 검사를 추가하는 것보다 빠릅니다. 그러나 몇 가지 주름이 있습니다: 경우에 따라 원래 Singleton으로 설계되지 않은 기존 형식은 C# 언어의 제네릭을 사용하여 만들 수 있습니다. 그러나이 방법은 Singleton 패턴의 많은 결과가 부족합니다 : 고유성을 보장 할 수 없으며 (누구나 Public 생성자 덕분에 Product2를 인스턴스화 할 수 있기 때문에), 실제로 알려진 상태로 개체를 초기화 할 수 없습니다 (이후 생성자는 제네릭의 «new()» 제약 조건 덕분에 매개 변수가 없는 생성자여야 하며, 컴파일러는 매개 변수화된 형식을 인스턴스화할 수 없습니다. 실제로 이 구현은 인스턴스의 네임스페이스를 잘 알려진 이름 «Singleton»으로만 제한하므로 원하는 «단일» 인스턴스를 찾을 수 있는 잘 알려진 위치를 제공합니다. .NET 최적화된 코드는 위와 동일한 코드를 보여 주지만 보다 현대적인 기본 제공 .NET 기능을 사용합니다. 여기서는 우아한 .NET 특정 솔루션이 제공됩니다. Singleton 패턴은 단순히 개인 생성자와 느리게 초기화되는 정적 readonly 인스턴스 변수를 사용합니다. 스레드 안전은 컴파일러에 의해 보장됩니다. 지연 형식을 사용 하 여 스레드 안전 Singleton을 구현 하기 위해 클래스를 수정 해 보겠습니다: 위의 코드는 암시적으로 LazyThreadSafetyMode.ExecutionAndPublication 지연 대 한 스레드 안전 모드로 사용 합니다.