Простая, но мощная система логирования для игр, реализованная с использованием паттерна Singleton (Одиночка). Проект демонстрирует правильное применение этого паттерна в контексте игровой разработки.
GameLogger — это глобальная система логирования, доступная из любой точки приложения. Она обеспечивает:
- Единую точку доступа для записи логов
- Хранение истории всех сообщений
- Разделение логов по уровням важности (Info, Warning, Error)
- Визуальное выделение критических сообщений цветом
- Потокобезопасную запись логов
В играх часто требуется единый экземпляр некоторых систем:
- Логгеры
- Менеджеры сохранений
- Системы звука
- Глобальные настройки
GameLogger использует eager initialization — экземпляр создается при первом обращении к классу, что гарантирует наличие единственного объекта на всё приложение.
public class GameLogger
{
// Единственный экземпляр (eager initialization)
public static GameLogger Instance { get; } = new GameLogger();
// Приватный конструктор — запрещаем создание через new
private GameLogger() { }
// Остальная логика...
}// Запись информационного сообщения
GameLogger.Instance.LogInfo("Игрок загрузился в локации \"Лес\"");
// Предупреждение (желтый цвет)
GameLogger.Instance.LogWarning("У игрока осталось 5 здоровья!");
// Ошибка (красный цвет)
GameLogger.Instance.LogError("Не удалось сохранить игру: файл занят");
// Вывод всей истории логов
GameLogger.Instance.PrintAllLogs();[19:45:31] [INFO] Игрок загрузился в локации "Лес"
[19:45:32] [INFO] Игрок получил 10 урона
[19:45:32] [WARNING] У игрока осталось 5 здоровья! (желтый цвет)
[19:45:33] [INFO] Подобран предмет "Целебное зелье"
[19:45:34] [ERROR] Не удалось сохранить игру: файл занят (красный цвет)
=== ВСЕ ЛОГИ ===
1. [19:45:31] [INFO] Игрок загрузился в локации "Лес"
2. [19:45:32] [INFO] Игрок получил 10 урона
3. [19:45:32] [WARNING] У игрока осталось 5 здоровья!
4. [19:45:33] [INFO] Подобран предмет "Целебное зелье"
5. [19:45:34] [ERROR] Не удалось сохранить игру: файл занят
| Свойство | Тип | Описание |
|---|---|---|
Instance |
GameLogger |
Статическое свойство для доступа к единственному экземпляру логгера |
| Метод | Описание |
|---|---|
LogInfo(string message) |
Записывает информационное сообщение (белый цвет) |
LogWarning(string message) |
Записывает предупреждение (желтый цвет) |
LogError(string message) |
Записывает ошибку (красный цвет) |
PrintAllLogs() |
Выводит все накопленные логи с нумерацией |
Несмотря на удобство, Singleton имеет недостатки:
- Скрытые зависимости — усложняет юнит-тестирование
- Глобальное состояние — сложно отслеживать, кто изменяет данные
- Нарушение SRP — класс управляет и своей логикой, и своим созданием
В этом проекте Singleton оправдан, так как логгер действительно должен быть единственным. Однако в других случаях стоит рассмотреть альтернативы (DI-контейнеры, фабрики).
Singleton/
├── Program.cs # Демонстрация работы логгера
└── README.md # Этот файл
- Реализация паттерна Singleton в C#
- Приватные конструкторы и статические свойства
- Работа с DateTime и форматированием времени
- Управление цветом консольного вывода
- Применение enum для уровней логирования
Vladimir Vaize | GitHub | Telegram Channel