Это неправильно, чтобы продлить синглтон? - PullRequest
0 голосов
/ 30 апреля 2020

Концепция Синглтона (по крайней мере, в java) гласит, что она должна быть реализована с помощью частного конструктора, верно? Пример:

public class Singleton {

    private static Singleton uniqueInstance;

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        if (uniqueInstance == null)
            uniqueInstance = new Singleton();

        return uniqueInstance;
    }

Однако, если мы проигнорируем этот факт и сделаем это с защищенным конструктором, он перестанет быть одиночкой? Я видел несколько примеров для inte rnet с этим сценарием.

public class Singleton {

    private static Singleton singleton;

    protected Singleton() {
    }

    public synchronized static Singleton getInstance() {

    if (singleton == null) {

        int tipoDoSingletonParaInstanciar = leUmArquivoTexto();

        if (tipoDoSingletonParaInstanciar == 1) {
        singleton = new SingletonSubclasse1();
        } else if(tipoDoSingletonParaInstanciar == 2) {
        singleton = new SingletonSubclasse2();
        } else {
        singleton = new Singleton();
        }
    }

    return singleton;
    }

    public void metodoQuePodeSerSobrescrito() {
    System.err.println("Singleton.metodoQuePodeSerSobrescrito()");
    }
}

И если защищенный конструктор не является проблемой сам по себе ... наследование синглтона не означает, что его подклассы могут создать несколько экземпляров родитель? Разве это не нарушает концепцию?

Можно ли наследовать синглтон, не нарушая его концепций (блокирование)?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Там вы создаете более одного объекта, что означает, что он больше не синглтон. И если вы делаете это, вы нарушаете концепцию синглтона.

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

0 голосов
/ 30 апреля 2020

Шаблон Singleton гарантирует, что существует только один экземпляр класса Singleton. Ниже приведен пример реализации Singleton (источник: https://en.wikipedia.org/wiki/Singleton_pattern)

public final class Singleton {

    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

Как видите, это класс final, что означает, что он не может (и должен нет) быть наследственным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...