Я бы не использовал ни того, ни другого. Я бы использовал дизайн, который реализует один и тот же метод журнала для каждой реализации. Так что это выглядит как Дизайн № 1, но немного по-другому.
Создайте потомков для каждого типа журнала и переопределите метод журнала.
Затем создайте фабрику для определенных целей, так:
- класс QueryLoggerFactory
- getInstance () // Возвращает экземпляр FireBugConsoleLogger
- класс ErrorLoggerFactory
- getInstance () // Возвращает экземпляр регистратора базы данных
- класс HistoryLoggerFactory
- getInstance () // Возвращает тот же или другой экземпляр регистратора базы данных
Таким образом, когда вам нужно зарегистрировать запрос, просто позвоните
QueryLoggerFactory->getInstance()->log($query);
И нигде в вашем приложении вам не нужно вызывать определенный метод. Если вы решите, что хотите сохранить запрос и в базе данных, просто создайте другой регистратор на своей фабрике. Вы можете даже создать регистратор, который регистрирует себя для двух других регистраторов, так что вы можете хранить ошибки в FireBug и в базе данных. Или вы можете создать журнал void, который ничего не регистрирует.