როგორ შეიძლება სინგლტონის ნიმუშის გამოყენებამ დაარღვიოს პოლიმორფიზმის პრინციპები?
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- ը
Այսպիսով, Singleton-ի shared ստատիկ հատկության ուղղակի օգտագործումը հաճախորդի կոդում նվազեցնում է ճկունությունը և խանգարում է իրականացման փոխարինմանը, ինչը պոլիմորֆիզմի հիմնական կողմն է տարբեր տիպերի օբյեկտների հետ աշխատելիս ընդհանուր ինտերֆեյսի միջոցով: Հաջող լուծումը՝ Singleton-ի օրինակին աշխատել պրոտոկոլ կամ բազային դասի միջոցով։