Cum poate utilizarea pattern-ului Singleton să încalce principiile polimorfismului?
sobes.tech AI
Răspuns de la AI
Singleton limitează crearea instanțelor unei clase la un singur obiect. Polimorfismul, însă, implică posibilitatea de a lucra cu obiecte din diferite clase printr-o interfață comună sau o clasă de bază.
Încălcarea apare atunci când codul client este rigid legat de o anumită clasă Singleton, în loc să lucreze cu o abstracție (protocol sau clasă de bază). În acest caz, nu este posibil să înlocuiți cu un alt obiect alternativ care implementează aceeași funcționalitate, deoarece clientul așteaptă exact o instanță Singleton.
// Utilizare greșită - clientul depinde direct de ConcreteSingleton
class ConcreteSingleton {
static let shared = ConcreteSingleton()
private init() {}
func performAction() {
print("Executarea acțiunii din ConcreteSingleton")
}
}
// Client
func clientFunction() {
// Legare rigidă la ConcreteSingleton
ConcreteSingleton.shared.performAction()
}
// Utilizare corectă - clientul depinde de un protocol
protocol Service {
func performAction()
}
class RealService: Service {
func performAction() {
print("Executarea acțiunii din RealService")
}
}
class MockService: Service {
func performAction() {
print("Executarea acțiunii din MockService")
}
}
// Singleton pentru furnizarea implementării prin protocol (opțional, se poate folosi 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
}
}
// Client
func flexibleClientFunction() {
// Lucru prin abstracție (protocol)
let service = ServiceProvider.shared.getService()
service.performAction()
}
// Exemple de polimorfism cu client flexibil
// ServiceProvider.shared.setService(MockService())
// flexibleClientFunction() va folosi MockService
Astfel, utilizarea directă a proprietății statice shared a Singleton-ului în codul client reduce flexibilitatea și împiedică înlocuirea implementărilor, ceea ce reprezintă un aspect cheie al polimorfismului atunci când se lucrează cu diferite tipuri de obiecte printr-o interfață comună. Soluția este să lucrați cu instanța Singleton printr-un protocol sau o clasă de bază.