Singleton nümunəsinin istifadəsi necə çox formallıq prinsiplərini poza bilər?
sobes.tech Süni İntellekt
AI-dan cavab
Singleton sinfi bir sinfin nümunələrinin yaradılmasını yalnız bir obyektlə məhdudlaşdırır. Polimorfizm isə, ümumi interfeys və ya əsas sinif vasitəsilə müxtəlif siniflərdən olan obyektlərlə işləmək imkanını nəzərdə tutur.
Pozğunluq, müştəri kodunun, konkret Singleton sinfinə sərt şəkildə bağlı olması və ya abstraksiya (protokol və ya əsas sinif) ilə işləməməsidir. Bu halda, eyni funksionallığı təmin edən başqa, alternativ obyektin yerinə qoyulması mümkün deyil, çünki müştəri dəqiq olaraq Singleton nümunəsini gözləyir.
// Yaxşı olmayan istifadə - müştəri birbaşa ConcreteSingleton-dən asılıdır
class ConcreteSingleton {
static let shared = ConcreteSingleton()
private init() {}
func performAction() {
print("ConcreteSingleton-dən əməliyyat yerinə yetirilir")
}
}
// Müştəri
func clientFunction() {
// Sert bağlılıq ConcreteSingleton-ə
ConcreteSingleton.shared.performAction()
}
// Yaxşı istifadə - müştəri protokol üzərindən asılıdır
protocol Service {
func performAction()
}
class RealService: Service {
func performAction() {
print("RealService-dən əməliyyat yerinə yetirilir")
}
}
class MockService: Service {
func performAction() {
print("MockService-dən əməliyyat yerinə yetirilir")
}
}
// Singleton, protokol vasitəsilə implementasiyanı təmin edir (istəyə bağlı, DI istifadə edilə bilər)
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üştəri
func flexibleClientFunction() {
// Abstraksiya (protokol) vasitəsilə işləmə
let service = ServiceProvider.shared.getService()
service.performAction()
}
// Polimorfizm nümunələri ilə elastik müştəri
// ServiceProvider.shared.setService(MockService())
// flexibleClientFunction() MockService istifadə edəcək
Beləliklə, Singleton-un shared statik xüsusiyyətinin birbaşa istifadəsi müştəri kodunun elastikliyini azaldır və implementasiyaların dəyişdirilməsini çətinləşdirir ki, bu da ümumi interfeys vasitəsilə müxtəlif obyekt tipləri ilə işləyərkən polimorfizmin əsas aspektidir. Həll yolu, Singleton nümunəsindən protokol və ya əsas sinif vasitəsilə istifadə etməkdir.