2013-03-26 2 views
1

Я пишу настольную MMO-игру, и я хочу проконсультироваться по вопросу архитектуры. У меня есть такие классы, как NetworkManager, ClientWindow, CachingTextureAtlas, они нужны только в одном экземпляре для игры, и вот мой вопрос: правильно ли сделать их одиночными? Если да, то это будет своего рода взаимодействие через глобальные классы, что не очень хорошо с точки зрения дизайна, как мне кажется, и если нет, мы будем составлять их на фасаде, и нам придется передать их всем конструкторам слишком много классов, что тоже не удобно. Какой лучший выбор?Композиция против нескольких синглетов

ответ

5

Singleton следует использовать осторожно (почти никогда). Я видел много мест, недавний sceanrio был hibernate session factory, где первоначально мы думали, что единственный экземпляр должен быть прекрасным, но затем натолкнулся на сценарий для нескольких экземпляров и в итоге переработал код. Другая проблема заключается в том, что вы пишете модульные тесты для своего кода, тогда это будет кошмар для всех классов, который зависит от этих одноэлементных классов.

Одним из решений может быть введение какой-либо фабрики, которая может предоставить вам эти экземпляры/она дает вам своеобразное направление и избегает прямого соединения. Другой подход состоит в том, чтобы иметь контейнер (например, контейнер pico) и вводить в качестве зависимостей конструктора, что и вы указали.

+2

+1 для предложения инъекции зависимости. пропустили это :) – greenkode

+0

Итак, вы против подхода синглтона, и что вы предлагаете сделать фабрикой, содержащей экземпляры классов? Или каждый раз предлагать новый экземпляр? Я использую Spring DI на стороне сервера, и я подумаю о том, чтобы уйти от синглтонов, но что мы должны делать с клиентской стороной, где нет смысла весной? И в случае CachingTextureAtlas очень дорого создавать экземпляр каждого раза, спасибо;) – OneMoreVladimir

+1

@OneMoreVladimir Я бы предпочел пойти с инъекцией зависимостей. это абстрагирует реализацию от методов, вызывающих ее. следовательно, вы можете изменить реализацию и, скорее всего, никогда не будете использовать код рефакторинга. – greenkode

Смежные вопросы