@ Учащийся Поскольку вопрос об интервью и в основном в Индии они просят написать в код Psuedo, чтобы оценить навыки кодирования кандидата, я стараюсь соответствовать требованиям кандидата.
Дизайн хорошопаттерны развивались в течение определенного периода времени с улучшениями в языке программирования, и Singleton не является исключением.Есть много способов, которыми мы можем создать класс Singleton, используя C #.Я хотел бы продемонстрировать некоторые ароматы, которые я могу вспомнить
1.Обычный ванильный синглтон без резьбы
public sealed class Singleton
{
private Singleton()
{
}
private static Singleton instance = null;
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
2.Синглтон с резьбой Saftey
public sealed class Singleton_ThreadLock
{
Singleton_ThreadLock()
{
}
private static readonly object padlock = new object();
private static Singleton_ThreadLock instance = null;
public static Singleton_ThreadLock Instance
{
get
{
// Uses the lock to avoid another resource to create the instance in parallel
lock (padlock)
{
if (instance == null)
{
instance = new Singleton_ThreadLock();
}
return instance;
}
}
}
}
3.Singleton - двухходовой сейф
public sealed class Singleton_DoubleThreadSafe
{
Singleton_DoubleThreadSafe()
{
}
private static readonly object padlock = new object();
private static Singleton_DoubleThreadSafe instance = null;
public static Singleton_DoubleThreadSafe Instance
{
get
{
if (instance == null)
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton_DoubleThreadSafe();
}
}
}
return instance;
}
}
}
4.Синглтон - ранняя инициализация
public sealed class Singleton_EarlyInitialization
{
private static readonly Singleton_EarlyInitialization instance = new Singleton_EarlyInitialization();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton_EarlyInitialization()
{
}
private Singleton_EarlyInitialization()
{
}
public static Singleton_EarlyInitialization Instance
{
get
{
return instance;
}
}
}
5.Singleton - Ленивая инициализация с использованием .Net 4.0+ Framework
public sealed class Singleton
{
private Singleton()
{
}
private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());
public static Singleton Instance
{
get
{
return lazy.Value;
}
}
}
Предостережения:
- Что ж, мало кто создает экземпляр классаиспользуя отражение (я сделал в одном из моих рамок), но его также можно избежать.В сети есть несколько примеров, которые могут показать, как этого избежать
- Лучше всего всегда делать класс Singleton запечатанным, так как это ограничит разработчиков от наследования класса.
- Существует множествоНа рынке есть IOC, которые могут создавать экземпляр Singleton обычного класса, не следуя приведенной выше реализации Singleton.