Универсальная Singleton <T>

У меня есть вопрос, действительно ли это - корректный подход для создания Универсальной Singleton?

 public class Singleton<T> where T : class, new()
    {
        private static T instance = null;

        private Singleton() { }

        public static T Instancia
        {
            get 
            {
                if (instance == null)
                    instance = new T();
                return instance;
            }
        }
    }

Править:

При проверке некоторого PDFs, который я нашел, универсальная Singleton сделала этот другой путь, это другое корректное?

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

    class SingletonCreator
    {
        static SingletonCreator() { }
        // Private object instantiated with private constructor
        internal static readonly T instance = new T();
    }

    public static T UniqueInstance
    {
        get { return SingletonCreator.instance; }
    }
}
8
задан Machavity 15 October 2018 в 19:43
поделиться

2 ответа

Проблема с общей фабрикой синглтонов заключается в том, что поскольку она является общей, вы не контролируете тип "синглтона", который инстанцируется, поэтому вы никогда не можете гарантировать, что созданный вами экземпляр будет единственным экземпляром в приложении.

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

19
ответ дан 5 December 2019 в 05:56
поделиться

Почему бы вам не использовать библиотеки, поставляемые с платформой .NET: http ://msdn.microsoft.com/en-us/library/ms229718.aspx ?

EDIT: 2019 Апрель по https://stackoverflow.com/users/1527/ Этот ответ больше недействителен. Другие ответы одобрены Microsoft.

Они были разработаны корпорацией Майкрософт, которая больше не рекомендует их использовать:

Мы не рекомендуем использовать класс Ftp WebRequest для новой разработки. Дополнительные сведения и альтернативы Ftp WebRequest см. в разделе WebRequest, который не следует использовать в GitHub. ( https ://docs.microsoft.com/en-us/dotnet/api/system.net.ftpwebrequest? view = netframework-4.7.2 )

Страница "WebRequest не должна использоваться" в свою очередь указывает на этот вопрос как на окончательный список библиотек!

-121--787308-

Поэтому я нашел ответ, после некоторых экспериментов. При добавлении fork = "true" в задачу javac дескриптор файла закрывается в конце задачи. Это позволяет моей модификации банка преуспеть позже в построении.

Это, к сожалению, потому что я должен помнить, чтобы добавить это к каждой родительской задачи javac.

-121--3977861-

Для общего фрагмента кода, который будет использоваться повторно, следует учитывать безопасность потоков в точке создания экземпляра singleton.

Как бы то ни было, (instance = = null) может иметь значение true в отдельных потоках.

0
ответ дан 5 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: