Sobes.tech
Middle+

Ինչպե՞ս կարող է 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- ը

Այսպիսով, Singleton-ի shared ստատիկ հատկության ուղղակի օգտագործումը հաճախորդի կոդում նվազեցնում է ճկունությունը և խանգարում է իրականացման փոխարինմանը, ինչը պոլիմորֆիզմի հիմնական կողմն է տարբեր տիպերի օբյեկտների հետ աշխատելիս ընդհանուր ինտերֆեյսի միջոցով: Հաջող լուծումը՝ Singleton-ի օրինակին աշխատել պրոտոկոլ կամ բազային դասի միջոցով։