Подтвердить что ты не робот

Какие шаблоны проектирования используются во всей .NET Framework?

Какие классы в .NET Framework реализуют различные шаблоны проектирования, такие как декоратор, factory и т.д.

4b9b3361

Ответ 1

Хорошо, что ваш запрос, вероятно, является ОЧЕНЬ обширным списком, поскольку шаблоны проектирования используются во всей платформе .NET. Вот несколько примеров, которые я могу придумать с головы:

Адаптер

Шаблон адаптера, общий механизм мостовых систем и платформ, реализован различными способами в платформе .NET. Одним из наиболее распространенных примеров этого в .NET являются Runtime Callable Wrappers или RCW. RCW, сгенерированный с помощью программы tlbimp.exe, предоставляет адаптеры, которые позволяют управляемому коду .NET легко вызывать устаревший COM-код через .NET API.

Factory Метод

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

Кроме того, другой распространенной формой этого шаблона являются методы .Parse() и .TryParse(), найденные во многих примитивных и базовых типах.

Итератор

Шаблон Итератора реализуется через пару интерфейсов и некоторые языковые конструкции, такие как foreach и ключевое слово yeild в С#. Интерфейс IEnumerable и его общий аналог реализуются десятками коллекций в платформе .NET, что позволяет легко, динамически итерации очень широкого спектра данных устанавливает:

IEnumerable<T>
IEnumerator<T>

foreach(var thing in someEnumerable)
{
   //
}

Ключевое слово yeild в С# позволяет реализовать истинную форму итератора, при этом только расходы на обработку итерации через цикл, когда требуется эта итерация:

IEnumerable<string> TokenizeMe(string complexString)
{
    string[] tokens = complexString.Split(' ');
    foreach (string token in toekens)
    {
        yield return token;
    }
}

Builder

Шаблон Builder реализован несколько раз в .NET framework. Несколько примечаний - это построители строк подключения. Строки подключения могут быть придирчивыми, а динамическое создание их во время выполнения иногда может быть болью. В классах класса String Builder в идеале демонстрируется шаблон построителя:

string connectionString = new SqlConnectionStringBuilder
{
    DataSource = "localhost",
    InitialCatalog = "MyDatabase",
    IntegratedSecurity = true,
    Pooling = false
}.ConnectionString;

Другие классы в рамках платформы .NET, такие как UriBuilder, также реализуют шаблон построителя.

Observer

Шаблон наблюдателя - это общий шаблон, который позволяет одному классу смотреть события другого. Начиная с .NET 4, этот шаблон поддерживается двумя способами: через интегрированные по языку события (тесно связанные наблюдатели) и через интерфейсы IObservable/IObserver (слабо связанные события).

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

public class EventProvider
{
    public event EventHandler SomeEvent;

    protected virtual void OnSomeEvent(EventArgs args)
    {
        if (SomeEvent != null)
        {
            SomeEvent(this, args); // Trigger event
        }
    }
}

public class EventConsumer
{
    public EventConsumer(EventProvider provider)
    {
        provider.SomeEvent += someEventHandler; // Register as observer of event
    }

    private void someEventHandler(EventArgs args)
    {
        // handle event
    }
}

Новый с платформой .NET 4 - это свободно связанные события. Это достигается путем реализации интерфейсов IObservable<out T> и IObserver<in T>, которые более непосредственно поддерживают оригинальный шаблон

Ответ 2

Сверху моей головы:

  • Шаблон Абстрактный Factory используется в инфраструктуре ADO.NET 2.0 (класс DbProviderFactory)
  • Шаблон Template Method используется во многих частях фреймворка (WinForms, WPF...)
  • Шаблон Builder также используется довольно часто (DbConnectionStringBuilder, UriBuilder...)
  • Я думаю, что предопределенные экземпляры (статические свойства) StringComparer, Encoding, Color и т.д. являются вариантом шаблона Prototype
  • Шаблон Прокси повсеместно используется при удалении .NET.
  • События - это вариант шаблона Наблюдатель
  • Шаблон Итератор используется в коллекциях
  • Шаблон Стратегия используется, например, в классах криптографии

Есть, вероятно, больше примеров, но все, о чем я могу думать прямо сейчас...

Ответ 3

  • Шаблон посетителя в ExpressionVisitor классе (Syste.Linq.Expression пространство имен).
  • Шаблон адаптера в System.Web.Abstractions - завершите различные веб-классы (HttpRequest, HttpResponse) более чем тестируемым способом - т.е. HttpResponseBase.
  • Factory Метод - Activator.CreateInstance - создает экземпляр указанного объекта.
  • Итератор - все реализации IEnumerable.

Ответ 4

Кроме того, NullObject

  • String.Empty;
  • EventArgs.Empty;

Ответ 5

Шаблон поставщика - используется в MembershipProvider, RoleProvider, ProfileProvider.

Ответ 6

Некоторые шаблоны дизайна GoF, реализованные в каркасе .Net:

Фасад - Интерфейс более высокого уровня для набора интерфейсов в подсистеме

MessageBox (System.Windows.Forms) - предоставляет многоразовый интерфейс высокого уровня для некоторых интерфейсов Windows Forms, вместо того, чтобы писать много кода для представления диалога, вы можете просто вызвать MessageBox.Show("Hello world");.

Это также упоминается в шаблонах проектирования в С# Стивена Джона Мецкера:

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

Если вы хотите узнать больше, проверьте исходный код для MessageBox

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

.Net framework использует String Interning для сохранения памяти на идентичных строках, это реализация шаблона Flyweight. Это видео от Curtis Lassam отлично справляется с объяснением String Interning.

Вы также можете принудительно запустить String Interning, вызвав String.Intern("Hello world");.

Ответ 7

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

ICloneable интерфейс с методом Clone() - классический пример прототипа.