Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

🎮 GameLogger - Singleton Pattern Implementation

Простая, но мощная система логирования для игр, реализованная с использованием паттерна Singleton (Одиночка). Проект демонстрирует правильное применение этого паттерна в контексте игровой разработки.

📋 Описание

GameLogger — это глобальная система логирования, доступная из любой точки приложения. Она обеспечивает:

  • Единую точку доступа для записи логов
  • Хранение истории всех сообщений
  • Разделение логов по уровням важности (Info, Warning, Error)
  • Визуальное выделение критических сообщений цветом
  • Потокобезопасную запись логов

🎯 Паттерн Singleton

Почему Singleton?

В играх часто требуется единый экземпляр некоторых систем:

  • Логгеры
  • Менеджеры сохранений
  • Системы звука
  • Глобальные настройки

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] Не удалось сохранить игру: файл занят

🛠️ API Reference

Свойства

Свойство Тип Описание
Instance GameLogger Статическое свойство для доступа к единственному экземпляру логгера

Методы

Метод Описание
LogInfo(string message) Записывает информационное сообщение (белый цвет)
LogWarning(string message) Записывает предупреждение (желтый цвет)
LogError(string message) Записывает ошибку (красный цвет)
PrintAllLogs() Выводит все накопленные логи с нумерацией

🤔 Когда НЕ стоит использовать Singleton?

Несмотря на удобство, Singleton имеет недостатки:

  • Скрытые зависимости — усложняет юнит-тестирование
  • Глобальное состояние — сложно отслеживать, кто изменяет данные
  • Нарушение SRP — класс управляет и своей логикой, и своим созданием

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

📁 Структура проекта

Singleton/
├── Program.cs           # Демонстрация работы логгера
└── README.md           # Этот файл

🎓 Чему можно научиться из этого проекта

  • Реализация паттерна Singleton в C#
  • Приватные конструкторы и статические свойства
  • Работа с DateTime и форматированием времени
  • Управление цветом консольного вывода
  • Применение enum для уровней логирования

👨‍💻 Автор

Vladimir Vaize | GitHub | Telegram Channel


⭐ Если этот проект был полезен, поставьте звезду на GitHub!