Является ли изменение кодов синглтон-класса единственным способом расширить функциональность синглтона при использовании шаблона синглтона enum версии? - PullRequest
0 голосов
/ 17 апреля 2019

В последнее время, когда я спрашиваю , как сделать методы поточно-ориентированными в одноэлементном шаблоне , кто-то сказал мне, что использование одноэлементного шаблона enum-версии является хорошим вариантом.и несколькими потоками.Если метод имеет побочные эффекты (изменяет состояние некоторой переменной), тогда вам нужно подумать о том, чтобы защитить его (сделать его синхронизированным) или его части.Поэтому я пишу такой код:

public enum ReStation {
    INSTANCE;  

    private List<Email> emailList;

    private ReStation() {
        emailList = new ArrayList<>();
    }

    public synchronized void recycleEmail(Email email) {
        System.out.println("Recycle station recycleing the email: "
                        + email.getContent());
        emailList.add(email);
    }

    public synchronized void deleteEmail(Email email) {
        emailList.remove(email);
    }

    public synchronized void clear() {
        emailList.clear();
    }
}

, однако, когда я читаю книгу под названием «Элементы шаблона проектирования многоразового объектно-ориентированного программного обеспечения», я сталкиваюсь с таким абзацем, как показано ниже:

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

Учитывая, что перечисление не может быть расширено, я действительно озадачен тем, как можно использовать расширенный экземпляр без изменения их кода при использовании одноэлементного шаблона версии перечисления?Является ли изменение кодов синглтон-класса единственным способом расширения функциональности синглтона?

1 Ответ

2 голосов
/ 17 апреля 2019

Когда в кавычке говорится, что «единственный экземпляр должен быть расширяемым путем создания подклассов», они говорят о ситуациях, когда:

  • Вам необходим отдельный выделенный экземпляр базового класса или интерфейса с хорошо известной точкой доступа, такой как процесс Logger;

  • Вам нужно выбрать конкретную реализацию во время выполнения, например, на основе конфигурации или другой информации времени выполнения. Например, ваш процесс Logger может быть реализован с помощью FileLogger или ConsoleLogger. Обычно должно быть возможно использовать любой подкласс Logger для реализации системного регистратора.

Вы не можете сделать это с "одноэлементным шаблоном enum version".

...