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

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

NetworkConnection networkConnectinon = NetworkConnection.getInstance();

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

Ответы [ 4 ]

3 голосов
/ 06 марта 2012

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

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

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

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

1 голос
/ 06 марта 2012

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

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

0 голосов
/ 06 марта 2012

Это может показаться интересным, но вместо этого у вас может быть несколько 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);

0 голосов
/ 06 марта 2012

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

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