singleton pattern과 static class 비교

공용 데이터를 저장하여 사용하고자 할 때, singleton 패턴이나 static 클래스를 사용한다.

1. 싱글톤 패턴 (Singleton design pattern)
-싱글톤 패턴이란 single instance object(해당 클래스의 인스턴스 하나)가 만들어지고, 어디서든지 그 싱글톤에 접근할 수 있도록 하기 위한 패턴


/// Sample singleton object.
public sealed class SiteStructure
{
    /// This is an expensive resource we need to only store in one place.
    object[] _data = new object[10];

    /// private constructor를 사용해서 static readonly로 객체 하나를 생성.
    static readonly SiteStructure _instance = new SiteStructure();

    /// 그 싱글톤에 접근하기 위한 property를 제공.
    public static SiteStructure Instance
    {
        get { return _instance; }
    }

    /// private constructor, 즉 외부에서는 이 생성자를 부를 수 없음.
    private SiteStructure()
    {
        // Initialize members, etc. here.
    }
}
// 싱글톤 객체를 인자로 전달 가능
SiteStructure site = SiteStructure.Instance;
OtherFunction(site); // Use singleton as parameter.



2. 정적 클래스 (Static class)
-static 키워드를 사용한 정적 클래스는 정적 멤버만 포함 가능
-정적 클래스는 new 키워드를 사용하여 정적 클래스의 인스턴스를 생성할 수 없음
-정적 클래스는 봉인 클래스 (sealed class) 임
-static 클래스는 single-instance, global 데이터를 저장하여 사용하는 용도로 적당
-그러나, 싱글톤은 인자(parameter)나 객체(object)로 사용가능하나 정적클래스는 불가능


/// Static class example.
static public class SiteStatic
{
    /// The data must be a static member in this example.
    static object[] _data = new object[10];

    /// C# doesn’t define when this constructor is run, but it will likely
    /// be run right before it is used.
    static SiteStatic()
    {
        // Initialize all of our static members.
    }
}


3. 싱글톤(Singleton)을 Interface와 함께 사용


/// Stores signatures of various important methods related to the site.
public interface ISiteInterface
{
};

/// ISiteInterface를 상속받은 SiteStructure 싱글톤
class SiteStructure : ISiteInterface
{
    // Implements all ISiteInterface methods.
    // 생략..
}

/// 테스트
class TestClass
{
    public TestClass()
    {
        // 싱글톤 객체를 ISiteInterface를 받는 함수에 인자로 전달.
        SiteStructure site = SiteStructure.Instance;
        CustomMethod((ISiteInterface)site);
    }

    /// Receives a singleton that adheres to the ISiteInterface interface.
    private void CustomMethod(ISiteInterface interfaceObject)
    {
        // Use the singleton by its interface.
    }
}



참고: http://dotnetperls.com/singleton-static

Leave a Reply

Your email address will not be published. Required fields are marked *