Должен ли я создать защищенный конструктор для моих одноэлементных классов? - PullRequest
3 голосов
/ 08 декабря 2010

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

public class SingletonPattern {// singleton class

    private static SingletonPattern pattern = new SingletonPattern();

    private SingletonPattern() {

    }

    public static SingletonPattern getInstance() {
        return pattern;
    }

}

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

Какие могут быть проблемы, если я определю мои конструкторы как protected?

Поиск экспертных представлений....

Ответы [ 4 ]

6 голосов
/ 08 декабря 2010

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

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

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

1 голос
/ 08 декабря 2010

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

0 голосов
/ 16 сентября 2014

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

Возможно иметь защищенный конструктор в одноэлементном классе.Если вы хотите иметь полиморфное поведение в 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;
  }
 }
0 голосов
/ 06 ноября 2013

Это не класс Singleton.Представьте, что я могу вызывать статический метод getInstance () n раз, и у меня может быть n объектов этого класса, что полностью нарушает шаблон Singleton.Чтобы сделать его 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...