Во-первых - статические метод нельзя перезаписать. Он принадлежит классу и выгружается в память до запуска программы.
Во-вторых - зачем для Singleton создавать какой-то абстрактный родитель? Советую почитать о вариантах создания "правильного" синглтон здесь
https://habr.com/ru/articles/129494/
В твоем случае я бы убрал getInstance из абстрактного класса. То есть - абстрактный класс задает контракт, а конкретная имплиментация Sql - является синглтоном. А какой-нибудь NoSql будет не синглтоном.
Но вообще лучше пересмотреть такую структуру