Какие шаблоны проектирования используются в .NET Framework? - PullRequest
28 голосов
/ 15 июля 2010

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

Ответы [ 7 ]

44 голосов
/ 15 июля 2010

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

Адаптер

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

Заводской метод

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

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

Итератор

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

IEnumerable<T>
IEnumerator<T>

foreach(var thing in someEnumerable)
{
   //
}

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

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

Builder

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

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

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

Наблюдатель

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

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

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>, которые напрямую поддерживают оригинальный шаблон проектирования Observer . Хотя базовая инфраструктура для этого шаблона не реализована напрямую какими-либо типами .NET Framework, которые мне известны, она является неотъемлемой частью .NET 4.

public class SomethingObservable: IObservable<SomethingObservable>
{
    private readonly List<IObserver<SomethingObservable>> m_observers;

    public IDisposable Subscribe(IObserver<SomethingObservable> observer)
    {
        if (!m_observers.Contains(observer))
        {
            m_observers.Add(observer);
        }
        var unsubscriber = new Unsubscriber(m_observers, observer)
        return unsubscriber;        
    }

    private class Unsubscriber: IDisposable
    {
        public Unsubscriber(IList<IObserver<SomethingObservable>> observers, IObserver<SomethingObservable> observer)
        {
            m_observers = observers;
            m_observer = observer;
        }

        private readonly IList<IObserver<SomethingObservable>>  m_observers;
        private readonly IObserver<SomethingObservable> m_observer;

        public void Dispose()
        {
            if (m_observer == null) return;
            if (m_observers.Contains(m_observer))
            {
                m_observers.Remove(m_observer);
            }
        }
    }
}

декоратор

Шаблон декоратор представляет собой способ предоставления альтернативных представлений или форм поведения через один базовый тип. Довольно часто требуется общий набор функций, но фактическая реализация этих функций должна измениться. Отличным примером этого в .NET Framework является класс Stream и его производные. Все потоки в .NET предоставляют одинаковую базовую функциональность, однако каждый поток работает по-разному.

  • Поток
    • MemoryStream
    • BufferedStream
    • FileStream
      • IsolatedStorageFileStream
    • PipeStream
      • AnonymousPipeClientStream
      • AnonymousPipeServerStream
      • NamedPipeClientStream
      • NamedPipeServerStream
    • CryptoStream
    • GZipStream

Многие, многие другие шаблоны проектирования используются в .NET Framework. Почти все аспекты .NET, от языка до фреймворка и до фундаментальных концепций времени выполнения, основаны на общих шаблонах проектирования. Значительные части .NET Framework, такие как ASP.NET, сами по себе являются шаблонами. Возьмем, к примеру, среду ASP.NET MVC, которая представляет собой веб-вариант MVC, или Model-View-Controller . Платформы пользовательского интерфейса WPF и Silverlight напрямую поддерживают шаблон MVVM или Model-View-ViewModel . Сам конвейер ASP.NET представляет собой набор шаблонов, включая фильтр перехвата , контроллер страницы , маршрутизатор и т. Д. Наконец, один из наиболее часто используемых шаблонов , состав , настолько широко используется в .NET Framework, что это, вероятно, один из самых фундаментальных шаблонов всей среды.

7 голосов
/ 15 июля 2010

с макушки головы:

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

Возможно, есть и другие примеры, но это все, что я могу вспомнить прямо сейчас ...

5 голосов
/ 15 июля 2010

Также NullObject

  • String.Empty;
  • EventArgs.Empty;
3 голосов
/ 15 июля 2010
  • Шаблон посетителя в ExpressionVisitor классе (Syste.Linq.Expression пространство имен).
  • Шаблон адаптера in System.Web.Abstractions - обернуть различные веб-классы (HttpRequest, HttpResponse) более подходящим для тестирования модулем способом, т.е. HttpResponseBase.
  • Метод фабрики - Activator.CreateInstance - создает экземпляр указанного объекта.
  • Шаблон итератора - все реализации IEnumerable.
1 голос
/ 02 декабря 2017

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

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

1 голос
/ 27 декабря 2016

Еще несколько шаблонов дизайна GoF, реализованных в .Net framework:

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

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

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

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

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

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

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

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

0 голосов
/ 15 июля 2010

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

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