싱글 톤이란 무엇이며 언제 사용해야합니까?
답변
싱글 톤은 하나의 인스턴스 만 만들 수있는 클래스이며, 해당 인스턴스에 간단하고 쉽게 액세스 할 수 있습니다. 싱글 톤 전제는 소프트웨어 개발 전반에 걸친 패턴입니다.
스레드 안전성 에 대한 좋은 조언을 포함하여 알아야 할 대부분의 내용을 다루는 C # 구현 “ C # 에서 싱글 톤 패턴 구현 “이 있습니다.
솔직히 말해서 싱글 톤을 구현 해야하는 경우는 매우 드-니다. 제 생각에 너무 자주 사용하지 않더라도 알아야 할 것들 중 하나 여야합니다.
답변
C #을 요청했습니다. 사소한 예 :
public class Singleton
{
private Singleton()
{
// Prevent outside instantiation
}
private static readonly Singleton _singleton = new Singleton();
public static Singleton GetSingleton()
{
return _singleton;
}
}
답변
의미 : 응용 프로그램 수명 동안 영구 인스턴스가 하나 뿐인 클래스입니다. 싱글 톤 패턴을 참조하십시오 .
사용해야 할 때 : 가능한 적은. 당신이 경우에만 절대적으로 확신 당신이 그것을 필요. “never”라고 말하지는 않지만 Dependency Injection 또는 정적 클래스와 같은 더 나은 대안이 있습니다.
답변
C #에서 싱글 톤을 구현하는 또 다른 방법은 개인적 으로이 방법을 선호합니다. 싱가 톤 클래스의 인스턴스를 메소드 대신 속성으로 액세스 할 수 있기 때문입니다.
public class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
//instance methods
}
그러나 두 가지 방법 모두 ‘올바른’것으로 간주되는 한, 그것은 개인적인 취향의 일입니다.
답변
using System;
using System.Collections.Generic;
class MainApp
{
static void Main()
{
LoadBalancer oldbalancer = null;
for (int i = 0; i < 15; i++)
{
LoadBalancer balancerNew = LoadBalancer.GetLoadBalancer();
if (oldbalancer == balancerNew && oldbalancer != null)
{
Console.WriteLine("{0} SameInstance {1}", oldbalancer.Server, balancerNew.Server);
}
oldbalancer = balancerNew;
}
Console.ReadKey();
}
}
class LoadBalancer
{
private static LoadBalancer _instance;
private List<string> _servers = new List<string>();
private Random _random = new Random();
private static object syncLock = new object();
private LoadBalancer()
{
_servers.Add("ServerI");
_servers.Add("ServerII");
_servers.Add("ServerIII");
_servers.Add("ServerIV");
_servers.Add("ServerV");
}
public static LoadBalancer GetLoadBalancer()
{
if (_instance == null)
{
lock (syncLock)
{
if (_instance == null)
{
_instance = new LoadBalancer();
}
}
}
return _instance;
}
public string Server
{
get
{
int r = _random.Next(_servers.Count);
return _servers[r].ToString();
}
}
}
dofactory.com 에서 코드를 가져 왔지만 그렇게 멋진 것은 아니지만 Foo and Bar가있는 예제보다 C # 3.0 Design Patterns에 대한 Judith Bishop의 추가 책 보다 Mac 도크의 활성 응용 프로그램에 대한 예제가 있습니다.
코드를 보면 실제로 for 루프에 새 객체를 작성하고 있으므로 새 객체를 만들지 만 oldbalancer와 newbalancer가 동일한 인스턴스를 갖는 결과로 인스턴스를 재사용합니다. 어떻게? 그 인해 고정 기능을 사용 키워드 GetLoadBalancer () , 임의의리스트에서 정적 인 다른 서버의 값을 갖는 불구 GetLoadBalancer ()를 타입 자체보다는 특정 개체에 속한다.
또한 이중 확인 잠금이 있습니다.
if (_instance == null)
{
lock (syncLock)
{
if (_instance == null)
MSDN부터
lock 키워드는 한 스레드가 중요한 코드 섹션에 들어 가지 않고 다른 스레드가 중요한 섹션에 있도록합니다. 다른 스레드가 잠긴 코드를 입력하려고하면 객체가 해제 될 때까지 기다립니다.
따라서 매번 상호 배제 잠금이 필요합니다. 불필요하더라도 불필요하므로 null 검사가 있습니다.
잘하면 그것은 더 많은 것을 지우는 데 도움이됩니다.
내 이해가 잘못된 길을 가고 있다면 의견을 말하십시오.
답변
Singleton (그리고 이것은 C #에 묶여 있지 않으며 OO 디자인 패턴입니다)은 응용 프로그램 전체에서 클래스의 인스턴스를 하나만 만들 수있게하려는 경우입니다. 개인적인 경험으로는 말할 것이지만, 종종 큰 고통의 원천이되지만 사용에는 일반적으로 전 세계 자원이 포함됩니다.
답변
싱글 톤의 인스턴스는 하나만있을 수 있지만 정적 클래스와 동일하지 않습니다. 정적 클래스는 정적 메서드 만 포함 할 수 있으며 인스턴스화 할 수 없지만 싱글 톤 인스턴스는 다른 객체와 같은 방식으로 사용될 수 있습니다.
