Ответ 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>
, которые более непосредственно поддерживают оригинальный шаблон