Как може използването на патърна Singleton да нарушава принципите на полиморфизма?
sobes.tech AI
Отговор от AI
Singleton ограничава създаването на екземпляри на клас до един обект. Полиморфизмът обаче предполага възможността за работа с обекти от различни класове чрез общ интерфейс или базов клас.
Нарушението възниква, когато клиентският код е строго свързан с конкретен Singleton клас, вместо да работи с абстракция (протокол или базов клас). В този случай не е възможно да се замени с друг, алтернативен обект, който реализира същата функционалност, тъй като клиентът очаква точно екземпляр на Singleton.
// Лошо използване - клиентът зависи директно от ConcreteSingleton
class ConcreteSingleton {
static let shared = ConcreteSingleton()
private init() {}
func performAction() {
print("Изпълнение на действие от ConcreteSingleton")
}
}
// Клиент
func clientFunction() {
// Строга връзка с ConcreteSingleton
ConcreteSingleton.shared.performAction()
}
// Добро използване - клиентът зависи от протокол
protocol Service {
func performAction()
}
class RealService: Service {
func performAction() {
print("Изпълнение на действие от RealService")
}
}
class MockService: Service {
func performAction() {
print("Изпълнение на действие от MockService")
}
}
// Singleton за предоставяне на реализация чрез протокол (по избор, може да се използва 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
}
}
// Клиент
func flexibleClientFunction() {
// Работа чрез абстракция (протокол)
let service = ServiceProvider.shared.getService()
service.performAction()
}
// Примери за полиморфизъм с гъвкав клиент
// ServiceProvider.shared.setService(MockService())
// flexibleClientFunction() ще използва MockService
По този начин, директната употреба на статичната собственост shared на Singleton в клиентския код намалява гъвкавостта и затруднява замяната на реализации, което е ключов аспект на полиморфизма при работа с различни типове обекти чрез общ интерфейс. Решението е да работите с инстанцията на Singleton чрез протокол или базов клас.