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.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-ийн жишээг протокол эсвэл үндсэн классаар дамжуулан ашиглах явдал юм.