Singleton Deseni
- İngilizcesi
- Singleton Pattern
- Okunuşu
- singıltın petırn
Kısaca
Singleton deseni, bir sınıfın yalnızca tek bir örneğinin bulunmasını sağlayan ve ona tek, küresel bir erişim noktası sunan oluşturucu bir tasarım desenidir.
Singleton deseni nedir?
Singleton deseni, bir uygulamada belirli bir sınıftan yalnızca tek bir nesnenin var olabilmesini garanti eder ve tüm koda ona ulaşmak için ortak bir yol verir. Klasik Gang of Four kitabındaki oluşturucu desenlerden biridir. Tipik adaylar; bir yapılandırma nesnesi, bir logger ya da veritabanı bağlantı havuzu gibi doğal olarak tek olan şeylerdir.
Klasik uygulamada constructor private yapılır; böylece başka hiçbir kod new çağıramaz, ve genellikle getInstance() adlı statik bir metot eklenir. Bu metot nesneyi ilk çağrıldığında oluşturur ve sonraki her çağrıda aynı nesneyi döndürür. JavaScript ve TypeScript'te modüller daha basit bir seçenek sunar: bir modül yalnızca bir kez değerlendirilir, dolayısıyla ondan dışa aktarılan nesne fiilen bütün uygulama için bir singleton'dır.
Bir ülkenin merkez bankası benzetmesi yapılabilir: yalnızca bir tane vardır ve ona ihtiyaç duyan herkes kendi bankasını kurmak yerine aynı kuruma gider. Çok iş parçacıklı (multithreaded) dillerde singleton kodu, iki iş parçacığının aynı anda iki örnek oluşturmaması için dikkatle yazılmalıdır.
Singleton aynı zamanda en çok eleştirilen desenlerden biridir, çünkü özünde gizlenmiş küresel durumdur (global state). Herhangi bir kod ona ulaşabildiği için bağımlılıkları gizler, birim testlerin birbirine durum sızdırmasına yol açar ve nesneyi sahte bir sürümle değiştirmeyi zorlaştırır. Birçok ekip, tek örneği başlangıçta oluşturup dependency injection ile dağıtmayı tercih eder; bu, gizli bağımlılık olmadan tek örnek avantajını korur.
Önemli noktalar
- Singleton sınıfın küresel bir erişim noktasıyla tam olarak bir örneği vardır.
- Genellikle private bir constructor ve statik
getInstance()metoduyla kurulur. - JavaScript'te bir modülden dışa aktarılan nesne singleton gibi davranır.
- Aşırı kullanım, testi zorlaştıran gizli küresel durum yaratır.
- Tek örneği paylaşmak için dependency injection yaygın bir alternatiftir.
Örnek
class Config {
private static instance: Config | undefined;
readonly apiUrl = "https://api.example.com";
private constructor() {} // prevents "new Config()" from outside the class
static getInstance(): Config {
if (!Config.instance) {
Config.instance = new Config(); // created only on first use
}
return Config.instance;
}
}
console.log(Config.getInstance() === Config.getInstance()); // trueSık sorulan sorular
Singleton deseni neden anti-pattern sayılıyor?
Eleştirmenler, herhangi bir kodun okuyabileceği ya da değiştirebileceği küresel durum getirdiği, bağımlılıkları gizlediği ve testlerin birbirini etkilemesine yol açtığı için onu anti-pattern olarak görür. Gerçekten tek olan kaynaklar için ölçülü kullanıldığında yine de pratik bir araçtır.
Singleton ne zaman kullanılmalı?
Bağlantı havuzu, önbellek ya da uygulama genelinde yapılandırma gibi tam olarak bir örneğin var olması ve paylaşılması gerektiğinde kullanılır. Yine de o tek örneği bir kez oluşturup dependency injection ile geçirmeyi düşünün.
Singleton ile statik sınıf arasındaki fark nedir?
Statik sınıf yalnızca statik metotları gruplar ve hiç örneklenmez; singleton ise arayüzleri uygulayabilen, durum tutabilen ve değer olarak dolaştırılabilen gerçek bir nesnedir. Bu, singleton'ı bir dizi statik fonksiyondan daha kolay değiştirilebilir ya da genişletilebilir kılar.
İlgili sayfalar
- Tasarım DeseniYazılım Mimarisi, s. 42Tasarım deseni, yazılım tasarımında sık görülen bir soruna kanıtlanmış, yeniden kullanılabilir çözümdür; hazır kod değil, genel bir şablon olarak anlatılır.
- OOPProgramlamanın Temelleri, s. 41OOP, yani nesne yönelimli programlama, kodu ilişkili verileri onlar üzerinde işlem yapan fonksiyonlarla birleştiren nesneler etrafında düzenleme yöntemidir.
- SınıfProgramlamanın Temelleri, s. 49Sınıf, nesne yönelimli programlamada bir grup nesnenin paylaştığı veri ve davranışı tanımlayan, nesnelerin örnek olarak ondan oluşturulduğu bir plandır.
- Dependency InjectionYazılım Mimarisi, s. 10Dependency injection, bir nesnenin ihtiyaç duyduğu diğer nesneleri kendisi oluşturmak yerine dışarıdan almasını sağlayan bir tasarım tekniğidir.
- Observer DeseniYazılım Mimarisi, s. 28Observer deseni, subject adlı bir nesnenin durumu değiştiğinde abone listesini otomatik olarak bilgilendirdiği davranışsal bir tasarım desenidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin