Singleton Kalıbı
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 65 / 87.
Singleton Pattern, uygulamanız boyunca bir sınıfın yalnızca bir örneğinin olmasını ve bu örneğe global bir erişim noktası sağlanmasını garanti eden yaratıcı bir tasarım desenidir. Bu, yapılandırma yöneticileri, bağlantı havuzları veya günlük kaydı hizmetleri gibi paylaşılması gereken kaynaklar için kullanışlıdır.
Desen, oluşturucuyu private yaparak doğrudan örnek oluşturmayı engeller. Bunun yerine, tek örneğe erişimi statik bir yöntem denetler:
public class DatabaseConnection {
private static DatabaseConnection instance;
// Private constructor doğrudan örneklemeyi engeller
private DatabaseConnection() {
System.out.println("Connection created");
}
// Global erişim noktası
public static DatabaseConnection getInstance() {
if (instance == null) {
instance = new DatabaseConnection();
}
return instance;
}
public void query(String sql) {
System.out.println("Executing: " + sql);
}
}getInstance() çağrılarının her biri aynı nesneyi döndürür. Örnek yalnızca ilk kez istendiğinde oluşturulur. Buna tembel başlatma denir:
DatabaseConnection db1 = DatabaseConnection.getInstance();
DatabaseConnection db2 = DatabaseConnection.getInstance();
System.out.println(db1 == db2); // true - same instanceSingleton'ın temel bileşenleri şunlardır: örneği tutan bir private static alan, bir private oluşturucu ve örneği döndüren bir public static yöntem. Bu birleşim, nesneyi kaç kez istersen iste, her zaman aynı nesneyi almanı garanti eder.
Görev
KolaySingleton Pattern'ı kullanarak bir uygulama için yapılandırma yöneticisi oluşturalım! Yapılandırma yöneticiniz, uygulamanızın tüm bölümlerinin, erişim isteme sayıları ne olursa olsun aynı ayarları paylaşmasını sağlayacak.
Kodunuzu iki dosya arasında düzenleyeceksiniz:
AppConfig.java: Uygulama yapılandırma ayarlarını yöneten bir Singleton sınıfı oluşturun.AppConfigsınıfınız şunlara sahip olmalıdır:Tek örneği tutacak private static bir alan.
appNameadlı private String alanı vemaxUsersadlı private int alanı.appNamealanını"MyApplication"vemaxUsersalanını100olarak başlatan, ardındanAppConfig initializedyazdıran private bir constructor.Örnek henüz mevcut değilse örneği oluşturan (geç başlatma), ardından örneği döndüren public static
getInstance()metodu.Uygulama adını güncelleyen bir
setAppName(String name)metodu.Maksimum kullanıcı sayısını güncelleyen bir
setMaxUsers(int max)metodu.displaySettings()yazdıran birApp: [appName], Max Users: [maxUsers]metodu.Main.java: Singleton'ınızın doğru çalıştığını gösterin! İki girdi alacaksınız: yeni bir uygulama adı (String) ve yeni bir maksimum kullanıcı değeri (tamsayı).İlk olarak bir
AppConfigörneği alın ve bunuconfig1adlı bir değişkende saklayın. Varsayılan değerleri göstermek içindisplaySettings()metodunu çağırın.Ardından
setAppNameüzerindesetMaxUsersveconfig1metotlarını çağırarak ayarları girdi değerlerinizi kullanacak şekilde güncelleyin.Başka bir örnek alın ve bunu
config2içinde saklayın.displaySettings()üzerinden yapılan değişiklikleri yansıttığını kanıtlamak içinconfig2üzerindeconfig1metodunu çağırın.Son olarak,
Same instance: [true/false]karşılaştırmasını yaparak her iki referansın aynı nesneyi gösterip göstermediğiniconfig1 == config2şeklinde yazdırın.
Sırasıyla iki girdi alacaksınız: yeni uygulama adı (String) ve yeni maksimum kullanıcı sayısı (tamsayı).
Bu görev, Singleton Pattern'ın temel faydasını gösterir: yapılandırmaya kaç kez erişim isterseniz isteyin, her zaman aynı paylaşılan duruma sahip aynı örneği alırsınız!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String newAppName = scanner.nextLine();
int newMaxUsers = scanner.nextInt();
// TODO: AppConfig'in ilk örneğini al ve config1'e kaydet
// TODO: Varsayılan değerleri göstermek için config1 üzerinde displaySettings() çağır
// TODO: config1 üzerinde setAppName ve setMaxUsers kullanarak ayarları güncelle
// TODO: Başka bir örnek al ve config2'ye kaydet
// TODO: Değişikliklerin paylaşıldığını kanıtlamak için config2 üzerinde displaySettings() çağır
// TODO: Her iki referansın da aynı nesneye işaret edip etmediğini yazdır:
// "Same instance: [true/false]" using config1 == config2
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi