Sobes.tech
Middle+

Kako korišćenje Singleton obrasca može narušiti principe polimorfizma?

sobes.tech АИ

Одговор од АИ

Singleton ograničava kreiranje instanci klase na jedan objekat. Polimorfizam, međutim, podrazumeva mogućnost rada sa objektima različitih klasa putem zajedničkog interfejsa ili osnovne klase.

Prekršaj se dešava kada je klijentski kod čvrsto povezan sa konkretnom Singleton klasom, umesto da radi sa apstrakcijom (protokolom ili osnovnom klasom). U tom slučaju, nije moguće zameniti drugim, alternativnim objektom koji implementira istu funkcionalnost, jer klijent očekuje tačno instancu Singleton.

// Loša praksa - klijent direktno zavisi od ConcreteSingleton
class ConcreteSingleton {
    static let shared = ConcreteSingleton()
    private init() {}

    func performAction() {
        print("Izvršavanje akcije iz ConcreteSingleton")
    }
}

// Klijent
func clientFunction() {
    // Čvrsto vezivanje za ConcreteSingleton
    ConcreteSingleton.shared.performAction()
}

// Dobra praksa - klijent zavisi od protokola
protocol Service {
    func performAction()
}

class RealService: Service {
    func performAction() {
        print("Izvršavanje akcije iz RealService")
    }
}

class MockService: Service {
    func performAction() {
        print("Izvršavanje akcije iz MockService")
    }
}

// Singleton za pružanje implementacije putem protokola (opciono, može se koristiti 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
    }
}

// Klijent
func flexibleClientFunction() {
    // Rad putem apstrakcije (protokol)
    let service = ServiceProvider.shared.getService()
    service.performAction()
}

// Primeri polimorfizma sa fleksibilnim klijentom
// ServiceProvider.shared.setService(MockService())
// flexibleClientFunction() će koristiti MockService

Na ovaj način, direktno korišćenje statičke osobine shared Singleton-a u klijentskom kodu smanjuje fleksibilnost i otežava zamenu implementacija, što je ključni aspekt polimorfizma pri radu sa različitim tipovima objekata putem zajedničkog interfejsa. Rešenje je rad sa instancom Singleton-a putem protokola ili osnovne klase.