Распространено, когда объект используется в приложении.Каковы различные шаблоны / модели / способы совместного использования объекта через приложение?
Одним из распространенных способов является использование одноэлементного шаблона.Хотя я бы этого избегал.
Определяет "основной класс", затем устанавливает переменную-член и расширяет все остальные классы из этого "основного класса".
Точно нет.Помимо всего прочего, если это переменная instance , она все равно не будет "совместно использоваться" с экземплярами ваших других классов.Это также полное злоупотребление наследованием, которое, несомненно, сильно укусит вас в любом приложении значительного размера - ваши другие классы не будут логически иметь отношения наследования с вашим «основным» классом, не так ли?Как правило, наследование следует использовать только тогда, когда оно действительно уместно, а не для быстрого исправления.
Какой ваш предпочтительный шаблон?
Внедрение зависимостей.Когда ваше приложение запускается, создайте все соответствующие объекты, которые должны знать друг о друге, и расскажите им (обычно в конструкторе) об их зависимостях.Несколько разных объектов могут зависеть от одного и того же объекта, если это уместно.Для достижения этой цели вы можете использовать одну из many инфраструктур внедрения зависимостей.
Внедрение зависимостей обычно работает лучше, чем использование синглетонов, потому что:
- Сам классне знает, является ли зависимость на самом деле общей;почему это должно волновать?
- Глобальное состояние усложняет модульное тестирование
- Каждый класс делает свои зависимости более ясными, когда они объявлены - тогда легче перемещаться по приложению и видеть, как классы связаны сдруг друга.
Синглтоны и глобальные фабрики больше подходят для таких вещей, как ведение журнала - но даже тогда это означает, что довольно сложно протестировать аспекты протоколированияучебный класс.Намного проще создать зависимость, которая делает то, что вам нужно, и передать ее тестируемому объекту, чем добавлять способы возиться с одноэлементным (который обычно остается «фиксированным» после инициализации).