[C#] C #의 싱글 톤은 무엇입니까?

싱글 톤이란 무엇이며 언제 사용해야합니까?



답변

싱글 톤은 하나의 인스턴스 만 만들 수있는 클래스이며, 해당 인스턴스에 간단하고 쉽게 액세스 할 수 있습니다. 싱글 톤 전제는 소프트웨어 개발 전반에 걸친 패턴입니다.

스레드 안전성 에 대한 좋은 조언을 포함하여 알아야 할 대부분의 내용을 다루는 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 디자인 패턴입니다)은 응용 프로그램 전체에서 클래스의 인스턴스를 하나만 만들 수있게하려는 경우입니다. 개인적인 경험으로는 말할 것이지만, 종종 큰 고통의 원천이되지만 사용에는 일반적으로 전 세계 자원이 포함됩니다.


답변

싱글 톤의 인스턴스는 하나만있을 수 있지만 정적 클래스와 동일하지 않습니다. 정적 클래스는 정적 메서드 만 포함 할 수 있으며 인스턴스화 할 수 없지만 싱글 톤 인스턴스는 다른 객체와 같은 방식으로 사용될 수 있습니다.