Есть два объекта двух разных классов, которые должны работать с сетью. Пишу максимально отстраненно, не обессудьте. Так вот. Есть объект текущей интернет-сессии, с которым по идее должны работать по очереди два эти объекта, к примеру:
http = new httpSession();
object1 = new Class1();
object2 = new Class2();
object1.work(http);
object2.work(http);
Как было бы правильней, непосредственно передавать одну сессию последовательно в эти объекты, как показано в примере выше, или же внутри каждого объекта создавать собственную сессию и работать с ней?
Сессии в любом случае нужно создавать снаружи и передавать объектам, чтобы не перегружать объекты тем функционалом (создание интернет-сессий), для которого они не предназначены.
Далее, в данном конкретном абстрактном случае логичнее использовать одну сессию. По крайней мере не вижу причин создавать вторую.
Или обращение контроля.
Я против синглтонов. Поясню, почему. Вот предположим вы пишете модульный тест на Class1 или Class2 (вы же пишите модульные тесты?). И хотите протестировать поведение Class1 в контексте взаимодействия с сессией. Если сессия — синглтон, то протестировать можно будет лишь косвенно, наблюдая только результат работы объекта сессии, но не самого Class1. Таким образом, тест класса Class1 становится зависим от объекта сессии, а значит и его (сессии) кода, что противоречит модульности. Наоборот, если используется инверсия зависимостей, вы просто подсунете в object1.work(sessionMock) (что такое mock) и сможете тестировать ТОЛЬКО поведение Class1, проверяя какие именно методы мок-объекта вызываются, в каком порядке и с какими параметрами.
Я не совсем понял, почему вы противопоставляете эти 2 перпендикулярных понятия? Вы спокойно можете создавать Singleton и передавать его через инверсию зависимостей (aka Inversion of Control, Dependency Injection).
Если вы знакомы с таким джавским фреймворком как Spring, то там как раз все создаваемые объекты, которые вы потом будете инжектить в другие объекты, являются синглтонами по умолчанию.
Мне кажется это вопрос взаимодействия объектов. По логике вещей одно соединение — одна сессия. Но могут быть нюансы. Например два потока: управления и данных. Устанавливаются одновременно, работают параллельно. Тогда должен быть один общий объект сессии для обоих соединений (поток управления может изменить сессию, а поток данных может зависеть от новых данных). Общий итог: мне кажется все зависит от реального применения.