Menu
Coddy logo textTech

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 instance

Singleton'ı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.

challenge icon

Görev

Kolay

Singleton 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. AppConfig sınıfınız şunlara sahip olmalıdır:

    Tek örneği tutacak private static bir alan.

    appName adlı private String alanı ve maxUsers adlı private int alanı.

    appName alanını "MyApplication" ve maxUsers alanını 100 olarak başlatan, ardından AppConfig initialized yazdı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 bir App: [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 bunu config1 adlı bir değişkende saklayın. Varsayılan değerleri göstermek için displaySettings() metodunu çağırın.

    Ardından setAppName üzerinde setMaxUsers ve config1 metotlarını çağırarak ayarları girdi değerlerinizi kullanacak şekilde güncelleyin.

    Başka bir örnek alın ve bunu config2 içinde saklayın. displaySettings() üzerinden yapılan değişiklikleri yansıttığını kanıtlamak için config2 üzerinde config1 metodunu ç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ğini config1 == 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
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Java derleyicisi