Kuidas võib Singleton mustri kasutamine rikkuda polümorfismi põhimõtteid?
sobes.tech AI
Vastus AI-lt
Singleton piirab klassi eksemplaride loomist ühe objekti kaudu. Polümorfism eeldab võimalust töötada erinevate klasside objektidega läbi ühise liidese või põhiklassi.
Rikkumine toimub siis, kui kliendi kood on rangelt seotud konkreetse Singleton klassiga, selle asemel et töötada abstraktsiooni (protokolli või põhiklassi) kaudu. Sellisel juhul ei ole võimalik asendada teise, alternatiivse objekti, mis täidab sama funktsiooni, kuna klient ootab just Singletoni eksemplari.
// Halb kasutus - klient sõltub otse ConcreteSingletonist
class ConcreteSingleton {
static let shared = ConcreteSingleton()
private init() {}
func performAction() {
print("Teostab tegevust ConcreteSingletonist")
}
}
// Klient
func clientFunction() {
// Rangelt seotud ConcreteSingletoniga
ConcreteSingleton.shared.performAction()
}
// Hea kasutus - klient sõltub protokollist
protocol Service {
func performAction()
}
class RealService: Service {
func performAction() {
print("Teostab tegevust RealService'ist")
}
}
class MockService: Service {
func performAction() {
print("Teostab tegevust MockService'ist")
}
}
// Singleton pakub teostust protokolli kaudu (valikuline, saab kasutada 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
}
}
// Klient
func flexibleClientFunction() {
// Töötamine abstraktsiooni kaudu (protokoll)
let service = ServiceProvider.shared.getService()
service.performAction()
}
// Polümorfismi näited paindlikul kliendil
// ServiceProvider.shared.setService(MockService())
// flexibleClientFunction() kasutab MockService
Seega, otsene staatiline shared omadus Singletonis klientkoodis vähendab paindlikkust ja takistab teostuste asendamist, mis on polümorfismi põhiaspekt, töötades erinevat tüüpi objektidega läbi ühise liidese. Lahendus on töötada Singletoni eksemplariga protokolli või põhiklassi kaudu.