Kā Singleton modeļa izmantošana var pārkāpt polimorfisma principus?
sobes.tech AI
Atbilde no AI
Singleton ierobežo klases piemēra izveidi ar vienu objektu. Polimorfisms paredz iespēju strādāt ar dažādu klases objektiem caur kopēju saskarni vai pamata klasi.
Pārkāpums notiek, kad klienta kods stingri saistās ar konkrētu Singleton klasi, nevis strādā ar abstrakciju (protokolu vai pamata klasi). Šādā gadījumā nav iespējams aizstāt ar citu, alternatīvu objektu, kas īsteno to pašu funkcionalitāti, jo klients sagaida tieši Singleton instanci.
// Slikta izmantošana - klients tieši atkarīgs no ConcreteSingleton
class ConcreteSingleton {
static let shared = ConcreteSingleton()
private init() {}
func performAction() {
print("Veic darbību no ConcreteSingleton")
}
}
// Klients
func clientFunction() {
// Stingra saistība ar ConcreteSingleton
ConcreteSingleton.shared.performAction()
}
// Labāka izmantošana - klients ir atkarīgs no protokola
protocol Service {
func performAction()
}
class RealService: Service {
func performAction() {
print("Veic darbību no RealService")
}
}
class MockService: Service {
func performAction() {
print("Veic darbību no MockService")
}
}
// Singleton nodrošina realizāciju caur protokolu (pēc izvēles, var izmantot DI)
class ServiceProvider {
static let shared = ServiceProvider()
private init() {}
private var currentService: Service = RealService()
func setService(_ service: Service) {
currentService = service
}
func getService() -> Service {
return currentService
}
}
// Klients
func flexibleClientFunction() {
// Darbība caur abstrakciju (protokolu)
let service = ServiceProvider.shared.getService()
service.performAction()
}
// Polimorfisma piemēri ar elastīgu klientu
// ServiceProvider.shared.setService(MockService())
// flexibleClientFunction() izmantos MockService
Tādējādi tieša statiskā īpašība shared Singleton klienta kodā samazina elastību un traucē aizstāt realizācijas, kas ir galvenais polimorfisma aspekts, strādājot ar dažādu tipu objektiem caur kopēju saskarni. Risinājums ir strādāt ar Singleton instanci caur protokolu vai pamata klasi.