Singleton naqshidan foydalanish qanday qilib polimorfizm prinsiplarga zid bo'lishi mumkin?
sobes.tech AI
AIdan javob
Singleton sinf o'z sinfini faqat bitta ob'ekt bilan cheklaydi. Polimorfizm esa, umumiy interfeys yoki asosiy sinf orqali turli sinflardan bo'lgan ob'ektlar bilan ishlash imkoniyatini anglatadi.
Qoidabuzarlik shundaki, mijoz kodi qat'iy tarzda faqatgina aniq Singleton sinfiga bog'langan bo'lib, abstraktsiya (protokol yoki asosiy sinf) bilan ishlash o'rniga. Bu holda, aynan bir xil funksionallikni ta'minlaydigan boshqa alternativ ob'ektni o'rnatish mumkin emas, chunki mijoz aynan Singleton nusxasini kutmoqda.
// Yomon foydalanish - mijoz to'g'ridan-to'g'ri ConcreteSingletonga bog'langan
class ConcreteSingleton {
static let shared = ConcreteSingleton()
private init() {}
func performAction() {
print("ConcreteSingletondan amal bajarilmoqda")
}
}
// Mijoz
func clientFunction() {
// Qattiq bog'lanish ConcreteSingletonga
ConcreteSingleton.shared.performAction()
}
// To'g'ri foydalanish - mijoz protokolga bog'langan
protocol Service {
func performAction()
}
class RealService: Service {
func performAction() {
print("RealServicedan amal bajarilmoqda")
}
}
class MockService: Service {
func performAction() {
print("MockServicedan amal bajarilmoqda")
}
}
// Singleton protokol orqali amalga oshirish uchun ta'minlaydi (ixtiyoriy, DI ishlatilishi mumkin)
class ServiceProvider {
static let shared = ServiceProvider()
private init() {}
private var currentService: Service = RealService()
func setService(_ service: Service) {
currentService = service
}
func getService() -> Service {
return currentService
}
}
// Mijoz
func flexibleClientFunction() {
// Abstraktsiya (protokol) orqali ishlash
let service = ServiceProvider.shared.getService()
service.performAction()
}
// Polimorfizm misollari bilan moslashuvchan mijoz
// ServiceProvider.shared.setService(MockService())
// flexibleClientFunction() MockService ni ishlatadi
Shunday qilib, Singletonning shared statik xususiyatidan to'g'ridan-to'g'ri foydalanish mijoz kodining moslashuvchanligini kamaytiradi va amalga oshirishlarni almashtirishni qiyinlashtiradi, bu esa umumiy interfeys orqali turli ob'ekt turlari bilan ishlashda polimorfizmning muhim jihati hisoblanadi. Yechim, Singleton nusxasini protokol yoki asosiy sinf orqali ishlatishdir.