Каков хороший шаблонный шаблонный шаблон в C # - PullRequest
30 голосов
/ 19 сентября 2008

У меня есть следующий шаблон C # singleton, есть ли способ улучшить его?

    public class Singleton<T> where T : class, new()
    {

        private static object _syncobj = new object();
        private static volatile T _instance = null;
        public static T Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (_syncobj)
                    {
                        if (_instance == null)
                        {
                            _instance = new T();
                        }
                    }
                }
                return _instance;
            }
        }

        public Singleton()
        { }

    }

Пример предпочтительного использования:

class Foo : Singleton<Foo> 
{
} 

Связано :

Очевидная одноэлементная реализация для .NET?

Ответы [ 22 ]

0 голосов
/ 30 мая 2009

Мой вклад для обеспечения создания по запросу данных экземпляра:


/// <summary>Abstract base class for thread-safe singleton objects</summary>
/// <typeparam name="T">Instance type</typeparam>
public abstract class SingletonOnDemand<T> {
    private static object __SYNC = new object();
    private static volatile bool _IsInstanceCreated = false;
    private static T _Instance = default(T);
<br/>
    /// <summary>Instance data</summary>
    public static T Instance {
        get {
            if (!_IsInstanceCreated)
                lock (__SYNC)
                    if (!_IsInstanceCreated)
                        _Instance = Activator.CreateInstance<T>();
            return _Instance;
        }
    }
}
0 голосов
/ 19 сентября 2008

Вам все это не нужно, C # уже имеет хороший встроенный шаблон синглтона.

static class Foo

Если вам нужно что-то более интересное, скорее всего, ваш новый синглтон будет отличаться настолько, что ваш общий шаблон окажется бесполезным.

РЕДАКТИРОВАТЬ: Под "что-нибудь более интересным" я в том числе наследования. Если вы можете наследовать от синглтона, он больше не является синглтоном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...