2014-10-14 2 views
2

На работе мы используем «шаблон», который я действительно не нашел в книге GoF (но это может быть из-за отсутствия компетентности в этом вопросе, я просто просмотрел шаблоны) и что я все еще сомневаюсь ,Какая картина это («Провайдер»)?

Скажем, если у нас есть многопроектное решение, содержащее проект DataAccess, который управляет доступом к данным. Затем, как правило, я вижу, имеющий структуру, как это:

Providers (Folder) 
- DataAccessProvider.cs 

Interfaces (Folder) 
- IFileLoader.cs 

Implementors (Folder) 
- FileLoader.cs 

Здесь FileLoader бы internal реализация интерфейса IFileLoader, и провайдер выглядит следующим образом:

public static class DataAccessProvider 
{ 
    public static IFileLoader FileLoader 
    { 
    get { return new FileLoader(); } 
    } 
} 

Какой шаблон проектирования это (если есть), и каковы его реальные возможности, помимо маскировки конкретной реализации интерфейса IFileLoader?

А во-вторых, это действительно «хороший стиль»? Интересно, например, что произойдет, если есть много звонков, как

string content = DataAccessProvider.FileLoader.LoadContentFromFile("abc.txt"); 

Этот вызов будет new FileLoader() всякий раз, когда он используется. Разве нет более элегантного способа сделать подобный подход?

+0

очень похож на специализированный сервисный локатор. И ServiceLocator - это антипаттерн. – Firo

ответ

5

В этом примере DataAccessProvider является примером простого метода Factory (шаблон). Обычно у вас будет метод под названием GetFileLoader() или CreateFileLoader() вместо версии Property, но результат будет таким же.

Цель возвращения IFileProvider вместо FileProvider для Dependency Inversion, таким образом можно было бы писать другие типы FileProvider и впрыснуть их в приложение без необходимости переделки или перекомпилировать все объекта, зависят от IFileProvider. Речь идет не о маскировке.

Если вас беспокоит количество экземпляров FileLoader, то для этого объекта можно использовать шаблон Singleton. Однако, как правило, это не проблема, если FileLoader - это легкий объект, так как сборщик мусора CLR позаботится об этом автоматически для вас.

+0

А, спасибо! Интересно, всегда ли этот шаблон всегда полезен, поскольку мы используем его почти в каждом отдельном проекте внутри решения, а 90% времени (и всегда будет) - только одна реализация соответствующего интерфейса. На данный момент класс Provider становится набором методов для получения реализаций различных интерфейсов, используемых для доступа к данным. Является ли это хорошей практикой, если вы знаете, что вы никогда не замените эту реализацию? – InvisiblePanda

+0

Чтобы быть техническим, ничего не всегда полезно. Тем не менее, как правило, лучше использовать интерфейс, поскольку он много покупает (помогает с инверсией зависимостей, модульным тестированием, насмешками, контейнерами IoC и т. Д.). И если вы используете интерфейс, проще всего использовать контейнер IoC или фабрики. Способность свопинга полезна, но не нужна для того, чтобы значение было там. –

+0

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

Смежные вопросы