Старый вопрос, который я знаю, но случайно наткнулся на это и думаю, что могу добавить что-нибудь полезное.
Возможно иметь защищенный конструктор в одноэлементном классе.Если вы хотите иметь полиморфное поведение в Singleton, вы можете сделать его абстрактным классом, установить конструктор в защищенный и делегировать создание экземпляра одному из конкретных подклассов.
Я нашел следующий пример вКнига "Дизайн шаблонов объяснил":
abstract public class Tax{
static private Tax instance;
protected Tax() {};
abstract double calcTax( double qty, double price);
public static Tax getInstance() {
// code to determine what implementing class to use
instance = USTax.getInstance();
return instance;
}
}
public class USTax extends Tax {
private static USTax instance;
private USTax() {
// instantation local members + Tax abstract class
}
public double calcTax ( double qty, double price){
// implementation
}
public static Tax getInstance() {
if(instance == null)
instance = new USTax();
return instance;
}
}