Hogyan sértheti meg a Singleton mintázat használata a polimorfizmus elveit?
sobes.tech MI
Válasz az MI-től
A Singleton korlátozza egy osztály példányainak létrehozását egyetlen objektumra. A polimorfizmus viszont lehetővé teszi, hogy különböző osztályok objektumaival dolgozzunk egy közös interfész vagy ősosztály segítségével.
A megsértés akkor fordul elő, amikor a klienskód szigorúan kötött egy konkrét Singleton osztályhoz, ahelyett, hogy absztrakcióval (protokoll vagy ősosztály) dolgozna. Ebben az esetben nem lehet más, alternatív objektumot behelyettesíteni, amely ugyanazt a funkcionalitást valósítja meg, mivel a kliens pontosan egy Singleton példányt vár.
// Hibás használat - a kliens közvetlenül függ a ConcreteSingleton-tól
class ConcreteSingleton {
static let shared = ConcreteSingleton()
private init() {}
func performAction() {
print("Folyamat végrehajtása a ConcreteSingleton-ból")
}
}
// Kliens
func clientFunction() {
// Szoros kötés a ConcreteSingleton-hoz
ConcreteSingleton.shared.performAction()
}
// Jó használat - a kliens egy protokolltól függ
protocol Service {
func performAction()
}
class RealService: Service {
func performAction() {
print("Folyamat végrehajtása a RealService-ból")
}
}
class MockService: Service {
func performAction() {
print("Folyamat végrehajtása a MockService-ből")
}
}
// Singleton a protokollon keresztül nyújtott implementációhoz (opcionális, DI-t lehet használni)
class ServiceProvider {
static let shared = ServiceProvider()
private init() {}
private var currentService: Service = RealService()
func setService(_ service: Service) {
currentService = service
}
func getService() -> Service {
return currentService
}
}
// Kliens
func flexibleClientFunction() {
// Absztrakción keresztül dolgozik (protokoll)
let service = ServiceProvider.shared.getService()
service.performAction()
}
// Polimorfizmus példák rugalmas klienssel
// ServiceProvider.shared.setService(MockService())
// flexibleClientFunction() MockService-t fog használni
Így a Singleton shared statikus tulajdonságának közvetlen használata a klienskódban csökkenti a rugalmasságot és megnehezíti a megvalósítások cseréjét, ami a polimorfizmus egyik kulcsfontosságú aspektusa, amikor különböző típusú objektumokkal dolgozunk közös interfészen keresztül. A megoldás az, hogy a Singleton példányával protokoll vagy ősosztály segítségével dolgozzunk.