Мне нужно поделиться объектом со многими другими объектами - я читал жалобы на синглтоны, так что я должен использовать вместо этого?
У меня есть 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 используют один и тот же экземпляр, если они нацелены на один и тот же сервер, предоставьте методы, требуемые в классе, где будет установлено соединение для его использования.