Sobes.tech
Middle+

Singleton deseni kullanımı nasıl çok biçimlilik ilkelerini ihlal edebilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Singleton, bir sınıfın örneklerinin oluşturulmasını yalnızca bir nesneyle sınırlar. Oysa, polimorfizm, ortak bir arayüz veya temel sınıf aracılığıyla farklı sınıflardan nesnelerle çalışma imkanı sağlar.

İhlal, müşteri kodunun, belirli bir Singleton sınıfına katı şekilde bağlı olması ve soyutlama (protokol veya temel sınıf) ile çalışmaması durumunda gerçekleşir. Bu durumda, aynı işlevselliği sağlayan başka bir alternatif nesne yerleştirilemez, çünkü müşteri tam olarak bir Singleton örneği bekler.

// Kötü kullanım - müşteri doğrudan ConcreteSingleton'a bağlı
class ConcreteSingleton {
    static let shared = ConcreteSingleton()
    private init() {}

    func performAction() {
        print("ConcreteSingleton'dan işlem yapılıyor")
    }
}

// Müşteri
func clientFunction() {
    // Sert bağlılık ConcreteSingleton'a
    ConcreteSingleton.shared.performAction()
}

// İyi kullanım - müşteri bir protokol'e bağlı
protocol Service {
    func performAction()
}

class RealService: Service {
    func performAction() {
        print("RealService'dan işlem yapılıyor")
    }
}

class MockService: Service {
    func performAction() {
        print("MockService'dan işlem yapılıyor")
    }
}

// Singleton, protokol aracılığıyla uygulama sağlayabilir (isteğe bağlı, DI kullanılabilir)
class ServiceProvider {
    static let shared = ServiceProvider()
    private init() {}

    private var currentService: Service = RealService()

    func setService(_ service: Service) {
        currentService = service
    }

    func getService() -> Service {
        return currentService
    }
}

// Müşteri
func flexibleClientFunction() {
    // Soyutlama (protokol) aracılığıyla çalışma
    let service = ServiceProvider.shared.getService()
    service.performAction()
}

// Polimorfizm örnekleri ile esnek müşteri
// ServiceProvider.shared.setService(MockService())
// flexibleClientFunction() MockService kullanacaktır

Bu nedenle, Singleton'un shared statik özelliğinin doğrudan kullanımı, müşteri kodunda esnekliği azaltır ve uygulamaları değiştirmeyi zorlaştırır; bu, ortak bir arayüz aracılığıyla farklı nesne türleriyle çalışırken polimorfizmin temel bir yönüdür. Çözüm, Singleton örneğiyle bir protokol veya temel sınıf aracılığıyla çalışmaktır.