Sobes.tech
Middle+

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.