싱글 톤이란 무엇이며 언제 사용해야합니까?
X
이야기 할 수 Y
있습니까? Y
단일 톤을 만드십시오 !) 결과적으로 테스트 / 디버깅 및 절차 적 프로그래밍 스타일로 이어집니다. 때로는 싱글 톤이 필요합니다. 대부분은 아닙니다.
싱글 톤이란 무엇이며 언제 사용해야합니까?
X
이야기 할 수 Y
있습니까? Y
단일 톤을 만드십시오 !) 결과적으로 테스트 / 디버깅 및 절차 적 프로그래밍 스타일로 이어집니다. 때로는 싱글 톤이 필요합니다. 대부분은 아닙니다.
답변:
싱글 톤은 하나의 인스턴스 만 만들 수있는 클래스이며, 해당 인스턴스에 간단하고 쉽게 액세스 할 수 있습니다. 싱글 톤 전제는 소프트웨어 개발 전반에 걸친 패턴입니다.
스레드 안전성 에 대한 좋은 조언을 포함하여 알아야 할 대부분의 내용을 다루는 C # 구현 " C # 에서 싱글 톤 패턴 구현 "이 있습니다.
솔직히 말해서 싱글 톤을 구현 해야하는 경우는 매우 드-니다. 제 생각에 너무 자주 사용하지 않더라도 알아야 할 것들 중 하나 여야합니다.
Lazy<T> Class
입니다.
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 검사가 있습니다.
잘하면 그것은 더 많은 것을 지우는 데 도움이됩니다.
내 이해가 잘못된 길을 가고 있다면 의견을 말하십시오.
디자인 패턴이며 C #에만 국한되지 않습니다. 이 위키 백과 기사 와 같이 인터넷과 SO를 통해 더 많은 정보를 얻을 수 있습니다.
소프트웨어 엔지니어링에서 싱글 톤 패턴은 클래스의 인스턴스화를 하나의 객체로 제한하는 데 사용되는 디자인 패턴입니다. 시스템 전체에서 작업을 조정하는 데 정확히 하나의 개체가 필요한 경우에 유용합니다. 이 개념은 때때로 하나의 객체 만 존재할 때보다 효율적으로 작동하거나 인스턴스화를 특정 개수의 객체 (예 : 5)로 제한하는 시스템으로 일반화됩니다. 일부는 그것을 과도하게 사용한다고 판단하여 반 패턴으로 간주하고, 클래스의 유일한 인스턴스가 실제로 필요하지 않은 상황에서 불필요한 제한을 초래하며, 전역 상태를 애플리케이션에 도입합니다.
한 번만 등록 할 수있는 수업을 원할 경우 사용해야합니다.
조회 데이터에 사용합니다. DB에서 한 번로드하십시오.
public sealed class APILookup
{
private static readonly APILookup _instance = new APILookup();
private Dictionary<string, int> _lookup;
private APILookup()
{
try
{
_lookup = Utility.GetLookup();
}
catch { }
}
static APILookup()
{
}
public static APILookup Instance
{
get
{
return _instance;
}
}
public Dictionary<string, int> GetLookup()
{
return _lookup;
}
}
싱글 톤이란 무엇인가 :
하나의 인스턴스 만 생성 할 수있는 클래스이며 일반적으로 해당 인스턴스에 대한 간단한 액세스를 제공합니다.
사용시기 :
상황에 따라 다릅니다.
참고 : DB 연결에서 사용하지 마십시오. 자세한 답변은 @Chad Grant의 답변을 참조하십시오
다음은 간단한 예입니다 Singleton
.
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
}
private Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
Lazy<T>
을 만들 수도 있습니다 Singleton
.
싱글 톤은 다음과 같습니다. http://en.wikipedia.org/wiki/Singleton_pattern
C #을 모르지만 실제로는 모든 언어에서 동일하지만 구현 만 다릅니다.
가능하면 일반적으로 싱글 톤을 피해야하지만 경우에 따라 매우 편리합니다.
내 영어 죄송합니다;)
Singleton 클래스는 전체 응용 프로그램 도메인에 대한 단일 인스턴스를 만드는 데 사용됩니다.
public class Singleton
{
private static Singleton singletonInstance = CreateSingleton();
private Singleton()
{
}
private static Singleton CreateSingleton()
{
if (singletonInstance == null)
{
singletonInstance = new Singleton();
}
return singletonInstance;
}
public static Singleton Instance
{
get { return singletonInstance; }
}
}
에서 이 문서는 설명 우리는 읽기 전용 변수와 응용 프로그램에서의 실용화를 사용하여 스레드 안전한 싱글 톤 클래스를 만드는 방법.
EX 주입해야하는 글로벌 정보에 Singleton을 사용할 수 있습니다.
필자의 경우 Logged 사용자 세부 정보 (사용자 이름, 권한 등)를 Global Static Class에 유지했습니다. 그리고 단위 테스트를 구현하려고 할 때 컨트롤러 클래스에 종속성을 주입 할 수있는 방법이 없었습니다. 따라서 정적 클래스를 싱글 톤 패턴으로 변경했습니다.
public class SysManager
{
private static readonly SysManager_instance = new SysManager();
static SysManager() {}
private SysManager(){}
public static SysManager Instance
{
get {return _instance;}
}
}
http://csharpindepth.com/Articles/General/Singleton.aspx#cctor
특정 클래스의 인스턴스 하나만 생성되도록하고 전체 애플리케이션에 대해 해당 인스턴스에 대한 간단한 글로벌 액세스를 제공해야하는 경우 C #에서 싱글 톤 디자인 패턴을 사용해야합니다.
싱글 톤 디자인 패턴을 사용할 수있는 실시간 시나리오 : 서비스 프록시 : 우리가 알고 있듯이 서비스 API를 호출하는 것은 애플리케이션에서 광범위한 작업입니다. 대부분의 시간이 걸리는 프로세스는 서비스 API를 호출하기 위해 서비스 클라이언트를 작성하는 것입니다. 서비스 프록시를 싱글 톤으로 작성하면 애플리케이션의 성능이 향상됩니다.
외관 : 응용 프로그램의 성능을 향상시킬 수있는 데이터베이스 연결을 Singleton으로 만들 수도 있습니다.
로그 : 응용 프로그램에서 파일에 대한 I / O 작업 수행은 비용이 많이 드는 작업입니다. Logger를 Singleton으로 만들면 I / O 작업의 성능이 향상됩니다.
데이터 공유 : 상수 값이나 구성 값이 있으면이 값을 Singleton으로 유지하여 응용 프로그램의 다른 구성 요소에서 읽을 수 있습니다.
캐싱 : 데이터베이스에서 데이터를 가져 오는 것은 시간이 많이 걸리는 프로세스입니다. 애플리케이션에서 마스터 및 구성을 메모리에 캐시하여 DB 호출을 피할 수 있습니다. 이러한 상황에서 Singleton 클래스를 사용하면 스레드 동기화로 캐싱을 처리하여 응용 프로그램의 성능을 크게 향상시킬 수 있습니다.
C #에서 싱글 톤 디자인 패턴의 단점 C #에서 싱글 톤 디자인 패턴을 사용하는 단점은 다음과 같습니다.
단위 테스트는 응용 프로그램에 전역 상태를 도입하기 때문에 매우 어렵습니다. 다중 스레드 환경에서 싱글 톤 인스턴스에 액세스하려면 잠금을 사용하여 오브젝트를 직렬화해야하므로 프로그램 내에서 병렬 처리의 가능성이 줄어 듭니다.
나는 다음 기사에서 이것을 취했다.
https://dotnettutorials.net/lesson/singleton-design-pattern/