Мне нужно поделиться объектом со многими другими объектами - я читал жалобы на синглтоны, так что я должен использовать вместо этого?

У меня есть Java-приложение с несколькими окнами JFrame, которые все происходят из класса BaseWindow. Каждое из этих окон должно иметь доступ к объекту NetworkConnection для отправки сообщений на сервер. Таким образом, я реализовал объект NetworkConnection как одноэлементный и в классе BaseWindow я даю ссылку на каждое окно, используя

NetworkConnection networkConnectinon = NetworkConnection.getInstance();

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

4 ответа

Решение

Статический getInstance() подход усложняет тестирование вашего приложения, потому что вы не можете заменить NetworkConnection с фиктивным объектом или используйте свежий экземпляр NetworkConnection для каждого модульного теста.

Для вашего основного класса может быть лучше внедрить объект NetworkConnection в каждый JFrame через их конструкторы - и создать интерфейс NetworkConnection, чтобы вы могли использовать либо реальное NetworkConnection, либо фиктивное.

Это шаблон внедрения зависимостей.

Обратите внимание, что ваше реальное NetworkConnection все еще может быть Singleton, если это необходимо - это просто другой способ предоставления его объектам, которые в нем нуждаются.

Но если в наши дни не стоит использовать синглтоны...

Я продолжаю читать заявления на этот счет, но я почему-то никогда не читаю ничего, что объясняет почему. Шаблон Singleton является важным строительным блоком. Как и любой другой, им можно злоупотреблять. Это само по себе не причина для того, чтобы не использовать его.

Это может звучать интересно, но у вас может быть несколько NetworkConnection объекты вместо этого, похоже на подход пула соединений:

public class NetworkConnection
{
    private static NetworkConnection[] connections;
    private static int size = 10;

    private NetworkConnection()
    { /*Constructor*/ }

    public static NetworkConnection getConnection(int index)
    {
        if (connections == null) 
        {
            for (int i = 0; i < size; i++)
                connections[i] = new NetworkConnection();
        }
        if (index < size)
            return connections[index];
        return null;
    }
}

И вы можете использовать разные соединения для каждого из ваших окон JFrame, например NetworkConnection.getConnection(3);

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

Другие вопросы по тегам