Изучение шаблона дизайна фабрики - PullRequest
4 голосов
/ 14 апреля 2010

Здесь была статья: http://msdn.microsoft.com/en-us/library/Ee817667%28pandp.10%29.aspx

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

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

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

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

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

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

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

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

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;
  }
}
1 голос
/ 14 апреля 2010

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

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