2010-04-13 5 views
4

Была статья здесь: http://msdn.microsoft.com/en-us/library/Ee817667%28pandp.10%29.aspxИсследования Pattern Factory Design

Первая часть ТПИ реализуется этот шаблон с абстрактными классами. Во второй части показан пример с классом интерфейса. Но ничто в этой статье не обсуждает, почему этот шаблон скорее использовал бы абстрактный или интерфейс.

Какое объяснение (преимущества одного над другим) вы бы дали? Не в общем, а для этой точной картины.

Тем не менее, хорошо известное преимущество интерфейса - это свободное соединение, поэтому почему бы ему не применить этот шаблон? Если нет, то почему все продукты Microsoft используют интерфейсы?

Я удивлен недостатком ответов. Кажется, люди знают, как делать что-то, но не совсем так.

+2

большой имя пользователя лол – jaywon

ответ

1

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

+0

Абстрактный базовый класс также заставляет конструктор и принимает вашу ссылку на наследство. Это, конечно, не то же самое, что интерфейс с частичной реализацией! –

+0

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

1

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

Они просто показывали, что могут обрабатывать любую форму абстракции. Интерфейс, как правило, рассматривается как «лучше», поскольку он допускает более слабую связь, не заставляя конструктора и не использовать вашу связь наследования. Тем не менее, еще реже использовать фабрику для возврата интерфейса, поскольку обычно вы хотите дать возможность людям внедрить собственную реализацию интерфейсов, что традиционно не является образцом заводской схемы (хотя это, безусловно, может быть)

Существует одно конкретное преимущество использования интерфейсов, о которых я могу думать; вы можете реализовать два разных интерфейса с одним и тем же классом. Вот (довольно глупо) пример:

interface IProvideInfo { 
    string Get(); 
} 
interface IProvideConnectionString : IProvideInfo { } 
interface IProvideCurrentUserName : IProvideInfo { } 

class CurrentContextProvider : IProvideConnectionString, IProvideCurrentUserName { 
    string IProvideConnectionString.Get() { 
    return ConfigurationManager.ConnectionStrings["db"]; 
    } 
    string IProvideCurrentUserName.Get() { 
    return _currentUserName; 
    } 
    string _currentUserName; 
    public string SetCurrentUserName(string s) { 
    _currerntUserName = s; 
    } 
} 

public class InfoProviderFactory { 
    CurrentContextProvider _provider = new CurrentContextProvider() 
    public IProvideInfo GetProvider(string key) { 
    return _provider; 
    } 
} 
+0

Хорошо известное преимущество интерфейса - это свободное соединение, так почему бы ему не применить этот шаблон? Если нет, то почему все продукты Microsoft используют интерфейсы? – user310291

+0

Если вы ищете Microsoft для лучших практик, вы действительно не смотрите в нужное место. Некоторые из их вещей неплохие (руководство от шаблонов и практик, ASP.Net MVC), большинство из них - медленная эволюция, сделанная для модернизации множества унаследованных проблем. Преимущество абстрактного класса заключается в том, что он поддерживает шаблон шаблона, который часто используется с фабриками. Обычно с интерфейсами вы хотите открыть себя для альтернативных реализаций, введенных во время выполнения, которые традиционный заводский шаблон не поддерживает. –