2010-12-08 1 views
3

По дизайну, в шаблоне Singleton конструктор должен быть помечен как частный, и предоставить метод создания, который будет перенастроен частным статическим членом экземпляра того же типа. Я создал только свои одноэлементные классы.Должен ли я создать защищенный конструктор для моих одноэлементных классов?

public class SingletonPattern {// singleton class 

    private static SingletonPattern pattern = new SingletonPattern(); 

    private SingletonPattern() { 

    } 

    public static SingletonPattern getInstance() { 
     return pattern; 
    } 

} 

Теперь, мне нужно расширить класс singleton, чтобы добавить новое поведение. Но частный конструктор не позволяет определить дочерний класс. Я думал изменить конструктор по умолчанию для защищенного конструктора для базового класса singleton.

Что может быть проблемой, если я определяю свои конструкторы как protected?

В поисках экспертных мнений ....

ответ

6

Если продлить одноэлементный класс через наследование, вы будете иметь 2 экземпляров одноплодного класса бегает кто-то должно захватить ваш одноплодные и оригинальный синглтон.

Если оригинальный синглтон концептуально действительно должен быть одноэлементным, то использование композиции - это, вероятно, путь. Однако, тогда замещаемость теряется (ваш класс не подлежит замене для исходного синглтона, он просто использует его).

У вас есть конкретный пример?

1

Если вы это сделаете, это не синглтон. Но, возможно, вам не нужен синглтон.

0

Это не класс Singleton. Представьте, что я могу вызвать метод getInstance() static n раз, и я могу иметь n объектов этого класса, полностью нарушая Singleton Pattern. Чтобы сделать это Singleton, вы должны проверить, был ли объект уже создан или нет в методе getInstance(). Если он уже создан, вы должны игнорировать и не создавать снова. Например, вы можете сделать что-то подобное, пожалуйста, игнорируйте ошибки синтаксиса, просто код для объяснения, может различаться на разных языках.

public class SingletonPattern {// singleton class 

private static SingletonPattern pattern = new SingletonPattern(); 

private SingletonPattern() { 

} 

public static SingletonPattern getInstance() { 
    if(SingletonPattern == null) { 
     return new SingletonPattern(); 
    } 
} 
0

Старый вопрос, который я знаю, но случилось, чтобы наткнуться на это и подумать, что я могу добавить что-то полезное.

Возможно создание защищенного конструктора в одноэлементном классе. Если вы хотите иметь полиморфное поведение на вашем Singleton, вы можете сделать его абстрактным классом, установите конструктор для защиты и делегируйте создание экземпляра одному из конкретных подклассов.

я нашел следующий пример, в книге "Design Patterns объяснил":

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; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^