Sobes.tech
Middle+

Kaip Singleton šablono naudojimas gali pažeisti polimorfizmo principus?

sobes.tech AI

Atsakymas iš AI

Singleton apriboja klasės egzempliorių kūrimą vienu objektu. Polimorfizmas numato galimybę dirbti su skirtingų klasių objektais per bendrą sąsają arba bazinį klasę.

Pažeidimas įvyksta, kai kliento kodas griežtai susiejamas su konkrečiu Singleton klasiu, vietoj to, kad dirbtų su abstrakcija (protokolu arba baziniu klasiu). Tokiu atveju neįmanoma pakeisti kitu, alternatyviu objektu, įgyvendinančiu tą pačią funkcionalumą, nes klientas tikisi būtent Singleton egzemplioriaus.

// Blogas naudojimas - klientas tiesiogiai priklauso nuo ConcreteSingleton
class ConcreteSingleton {
    static let shared = ConcreteSingleton()
    private init() {}

    func performAction() {
        print("Veiksmą atliekantis iš ConcreteSingleton")
    }
}

// Klientas
func clientFunction() {
    // Griežtas susiejimas su ConcreteSingleton
    ConcreteSingleton.shared.performAction()
}

// Geras naudojimas - klientas priklauso nuo protokolo
protocol Service {
    func performAction()
}

class RealService: Service {
    func performAction() {
        print("Veiksmą atliekantis iš RealService")
    }
}

class MockService: Service {
    func performAction() {
        print("Veiksmą atliekantis iš MockService")
    }
}

// Singleton teikia įgyvendinimą per protokolą (pasirinktinai, galima naudoti 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
    }
}

// Klientas
func flexibleClientFunction() {
    // Dirbama per abstrakciją (protokolą)
    let service = ServiceProvider.shared.getService()
    service.performAction()
}

// Polimorfizmo pavyzdžiai su lankstesniu klientu
// ServiceProvider.shared.setService(MockService())
// flexibleClientFunction() naudosis MockService

Taip tiesioginis shared statinio Singleton naudojimas klientų kode sumažina lankstumą ir trukdo pakeisti įgyvendinimus, kas yra pagrindinis polimorfizmo aspektas dirbant su skirtingų tipų objektais per bendrą sąsają. Sprendimas – dirbti su Singleton egzemplioriumi per protokolą arba bazinį klasę.