Sobes.tech
Middle+

Jak může použití vzoru Singleton narušovat principy polymorfismu?

sobes.tech AI

Odpověď od AI

Singleton omezuje vytváření instancí třídy na jeden objekt. Polymorfismus však předpokládá možnost práce s objekty různých tříd prostřednictvím společného rozhraní nebo základní třídy.

Porušení nastává, když je klientský kód pevně vázán na konkrétní třídu Singleton, místo aby pracoval s abstrakcí (protokolem nebo základní třídou). V takovém případě není možné nahradit jiným, alternativním objektem, který implementuje stejnou funkčnost, protože klient očekává přesně instanci Singleton.

// Špatné použití - klient je přímo závislý na ConcreteSingleton
class ConcreteSingleton {
    static let shared = ConcreteSingleton()
    private init() {}

    func performAction() {
        print("Provedení akce z ConcreteSingleton")
    }
}

// Klient
func clientFunction() {
    // Pevné vázání na ConcreteSingleton
    ConcreteSingleton.shared.performAction()
}

// Dobré použití - klient závisí na protokolu
protocol Service {
    func performAction()
}

class RealService: Service {
    func performAction() {
        print("Provedení akce z RealService")
    }
}

class MockService: Service {
    func performAction() {
        print("Provedení akce z MockService")
    }
}

// Singleton pro poskytování implementace přes protokol (volitelné, lze použít 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() {
    // Práce přes abstrakci (protokol)
    let service = ServiceProvider.shared.getService()
    service.performAction()
}

// Příklady polymorfismu s flexibilním klientem
// ServiceProvider.shared.setService(MockService())
// flexibleClientFunction() bude používat MockService

Tímto způsobem, přímé použití statické vlastnosti shared Singletonu v klientském kódu snižuje flexibilitu a ztěžuje nahrazení implementací, což je klíčový aspekt polymorfismu při práci s různými typy objektů přes společné rozhraní. Řešením je pracovat s instancí Singleton přes protokol nebo základní třídu.