Bu yazımda C# programlama dilinde Generic Singleton Pattern'nin uygulanmasını anlatacağım. Konuyu sadece kodları kopyalamak için bakıyorsanız biraz aşağı kaymanız yeterli olacaktır. Ama yazdığınız kodların ne anlama geldiğini bilmek bu kodlardan doğabilecek problemlerin veya bu kodların sizi kazandırdığını da doğru yorumlama açısından önemli olduğu için makaleyi de okumanız önemlidir.
Öncelikle kısaca bahsetmem gerekirse generic singleton tasarım deseni nesne üretiminde singleton patternini uygularken sizi kopyala yapıştır mantığından kurtaran ve bir anlamda kod kalitenizi artırarak okunabilirliğini de artıran bir tasarım kalıbıdır. Generic Singleton Pattern sizi sürekli singleton patterninin private constructor ve instance objelerini yazmanızdan kurtarır.
Önemli bir nokta singleton tasarım kalıbını çok iyi anlamanızın gerektiğidir. Daha önce yazdığım "Singleton Tasarım Deseni" makalesine buradan erişebilirsiniz. Singleton konusunu tam olarak anladıysanız devam etmenizi öneririm.
Makalenin devamında generic singleton tasarım deseni kodlarına ve aynı zamanda nasıl uygulandığına yer vermeye çalışacağım.
public abstract class Singleton<T> where T : class
{
protected static readonly object SyncRoot = new Object();
private static volatile T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
lock (SyncRoot)
{
if (_instance == null)
{
Type theType = typeof(T);
try
{
_instance = (T)theType.InvokeMember(theType.Name, BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic, null, null, null, CultureInfo.InvariantCulture);
}
catch (MissingMethodException ex)
{
throw new TypeLoadException(string.Format(CultureInfo.CurrentCulture, "The type '{0}' singleton tasarım örüntüsünde private constructor kullanılmalı.", theType.FullName), ex);
}
}
}
}
return _instance;
}
}
}
C# Generic Singleton Tasarım Deseni Uygulaması
Singleton olarak tasarlamak istediğiniz sınıfı aşağıdaki örnekte olduğu gibi düzenlerseniz o sınıfa singleton özelliği kazandırmış olacaksınız.
public class LoggingManager : Singleton<LoggingManager>
{
private static readonly JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
private LoggingManager()
{
}
public void LogWebApiRequest(RequestLogProxy requestLogProxy)
{
//Kodlar
}
}
Yorumlar
Yorum Gönder