2010-05-03 7 views
3

у меня есть 3 класса Вход чтобы все реализующий интерфейс Илог:singleton vs factory?

DatabaseLog 
FileLog 
ScreenLog 

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

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

, так что мои вопросы: следует ли использовать заводскую или одноэлементную модель здесь?

ответ

6

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

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

+0

правый, я думаю, что лучше. потому что если кто-то другой использует мои классы журнала в другом приложении, он может использовать другую логику. спасибо –

0

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

+0

что вы имеете в виду между всеми тремя классами? –

1

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

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

3

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

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

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

1

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