синглтон против фабрики? - PullRequest
3 голосов
/ 03 мая 2010

у меня есть 3 класса Log, которые все реализуют интерфейс iLog:

DatabaseLog
FileLog
ScreenLog

их может быть только один экземпляр. Сначала я хотел использовать один шаблон для каждого класса, но потом подумал, почему бы не использовать вместо этого фабрику для создания экземпляров, потому что тогда мне не нужно будет создавать один шаблон для каждого из них и для всех будущих классов Log.

и, возможно, кто-то захочет использовать их в будущем как несколько объектов.

поэтому мои вопросы: должен ли я использовать здесь фабричный или синглтон?

Ответы [ 5 ]

6 голосов
/ 03 мая 2010

Где должна находиться ответственность за создание экземпляра Logger? С каждым классом, который хочет войти? С каким-то надзорным компонентом, который понимает общий контекст?

Я думаю, что это скорее будет последним, и, следовательно, Фабрика будет иметь смысл. Завод может иметь всю логику для принятия решения о том, какой тип регистрации необходим.

3 голосов
/ 03 мая 2010

Синглтон и заводская модель служат совершенно разным целям. Этот шаблон синглтона используется для того, чтобы гарантировать наличие только одного экземпляра класса. Фабричный шаблон используется для абстрактного создания объекта. Вы можете использовать фабрику для создания синглтона, а сами фабрики часто являются синглетонами, но нет ни одного против другого. Они дополняют друг друга, а не противоположны.

В вашем случае реализация одноэлементного шаблона гарантирует, что вы можете иметь только один экземпляр каждого класса. Вы можете использовать фабрику, которая не создает новые экземпляры, если они уже существуют.

Если у вас есть интерфейс для ведения журнала и несколько реализаций для него (например, запись в файл или запись в сеть), вы можете использовать фабрику для динамического создания реализаций и скрыть процесс создания экземпляра, который может отличаться для каждой реализации. (например, открыть файл или открыть сокет). Вы все еще можете сделать свои объекты одиночными, если вы этого хотите.

1 голос
/ 03 мая 2010

Как уже говорилось, я бы также предложил использовать фабрику. Одним из преимуществ, когда вы не используете Singletons, является то, что у вас нет глобального состояния, что делает ваш код намного более тестируемым.

1 голос
/ 03 мая 2010

Что ж, если кто-то захочет создать несколько объектов этих типов, то об одиночном не может быть и речи.

Создайте фабрику, которая читает тип журнала из файла конфигурации (возможно) и возвращает ссылку ILog на конкретный тип

0 голосов
/ 03 мая 2010

Я бы использовал здесь фабрику, синглтон не может удовлетворить ваше требование одного экземпляра между всеми тремя классами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...