Похоже, вы заинтересованы в каком-то типе пула.
Вы можете сделать это по-разному. Одним из способов является создание класса, который обрабатывает все соединения, который является одноэлементным. Затем вы просто запрашиваете у пула соединение, например
SSHConnection con = ConnectionPool.getConnection(host, port);
Вы также можете использовать прокси для этого. В прокси вы фактически получаете заполнитель вместо фактического соединения. Прокси-сервер делится информацией с другими экземплярами, вроде
class ConnectionProxy {
private static SSHConnection connection;
}
переменная соединения является общей, и когда вы создаете новый ConnectionProxy, вы фактически получаете старое соединение, но похоже, что вы получаете новое соединение.
Другой вариант - просто передать экземпляр всем нуждающимся классам. Это позволит вам отслеживать, кто что делает, но при этом вы потеряете гибкость, позволяющую получить соединение откуда угодно.
Передача экземпляра поможет, если вы отлаживаете, подумайте об этом так. Вы находитесь в переполненной комнате, и у вас в ящике лежат деньги, для открытия которых нужен ключ. Если вы передадите этот ключ одному человеку (нуждающемуся в нем классу), выйдете из комнаты и вернетесь, а деньги уйдут, вы можете обвинить этого человека. Если вместо этого вы просто оставите ключ на столе рядом с коробкой (экземпляр является глобальным) и выйдете из комнаты, вернетесь и деньги исчезнут, тогда удачи вам выяснить, кто их забрал.
Ссылки:
*] Шаблон прокси - WikiPedia
Пример прокси
Точнее, это может выглядеть примерно так:
public class ConnectionProxy implements Connectable {
// where Connectable is some shared interface between ConnectionProxy
// and SSHConnection. The proxy should "look like" a connection, it just
// hides the actual connection behind the scenes.
private static SSHConnection connection;
public ConnectionProxy() { }
public ConnectionProxy(String host, int port) {
connection = new SSHConnection(host, port);
}
public void connect(String host, int port) {
if (isConnected()) {
return;
}
connection = new SSHConnection(host, port);
}
public void reconnect() {
connection = new SSHConnection(connection.getHost(), connection.getPort());
}
public boolean isConnected() {
return connection != null && connection.isConnected();
}
}
Вы используете класс, создавая его экземпляр или подключая его.
class Program {
public void sendMessage() {
ConnectionProxy proxy = new ConnectionProxy();
if (!proxy.isConnected()) {
// I guess noone connected it
return;
}
proxy.sendBytes();
}
}
И в диалоге подключения вы создаете экземпляр ConnectionProxy или подключаете его. Вы можете добавить поддержку нескольких соединений, то есть разных хостов и портов, просто сделав вместо этого переменное соединение списком и проверив правильность соединения для хоста и порта. Вы в основном создаете пул соединений, но для клиентского класса это выглядит так, как будто оно создает соединение.