Работа с паттернами проектирования — важный шаг для любого программиста на C# и .NET. В этой статье — основные аспекты паттернов проектирования, их определение и структура.
Что такое паттерн
Паттерн, или шаблон, проектирования — это устоявшееся в индустрии решение определенной проблемы проектирования, которая появляется в процессе разработки. Паттерны — это не конкретные участки кода, которые можно копировать и вставлять. Скорее они предлагают общие подходы и концепции, которые можно адаптировать под свою рабочую проблему. Если во время решения задачи вы будете придерживаться терминологии и конструкций паттернов, другие разработчики лучше и быстрее поймут код.
У паттернов — на три основные категории:
- Порождающие паттерны (Creational Patterns): фокусируются на процессах создания объектов без логики их создания.
- Структурные паттерны (Structural Patterns): касаются композиции объектов и классов, чтобы формировать крупные структуры.
- Поведенческие паттерны (Behavioral Patterns): связаны с взаимодействием и распределением обязанностей между объектами.
Разобраться в основах программирования сложно самостоятельно, если у вас до этого не было подходящего опыта. С базой помогут наставники на курсе Skypro «Java-разработчик». Вы вместе пройдете самые сложные этапы обучения, а после станете специалистом, готовым к выходу на новую работу.
Как описывают паттерны
У каждого паттерна проектирования есть своя структура. Основные компоненты всех шаблонов:
🟢 Имя (Name). Краткое описание паттерна, с ним проще документировать решения в разработке.
🟢 Задача (Intent). Описание проблемы, которую решает паттерн, и контекста, в котором он применяется.
🟢 Мотивация (Motivation). Описание, зачем применять паттерн, его типичные сценарии и примеры использования.
🟢 Структура (Structure). Графическое и текстовое описание классов и объектов, которые участвуют в паттерне, и их взаимосвязей.
🟢 Участники (Participants). Описание ролей и обязанностей для каждого класса или объекта внутри паттерна.
🟢 Взаимодействия (Collaborations). Описание, как участники паттерна взаимодействуют, чтобы выполнить задачи.
🟢 Последствия (Consequences). Обзор плюсов и минусов паттерна, его влияния на гибкость, производительность и поддержку кода.
🟢 Реализация (Implementation). Рекомендации, как использовать паттерн на практике.
🟢 Примеры кода (Sample Code). Обычно на языке C#. Помогают разработчикам эффективнее применить паттерн в своей работе.
🟢 Связанные паттерны (Related Patterns). Описание других паттернов, которые можно использовать вместе или как замену текущему.
5 популярных паттернов для проектирования
Паттерны проектирования помогают решать общие проблемы в работе и улучшать архитектуру кода. Рассмотрим пять наиболее популярных паттернов, которые часто используют разработчики на C# и .NET.
Singleton (Одиночка)
В этом случае у класса только один экземпляр с глобальной точкой доступа. Паттерн часто используют, чтобы соединяться с базой данных или настраивать приложения.
Пример — класс конфигурации, который дает доступ к настройкам приложения.
public class ConfigurationManager
{
private static ConfigurationManager _instance;
private static readonly object _lock = new object();private ConfigurationManager() { }
public static ConfigurationManager Instance
{
get
{
lock (_lock)
{
if (_instance == null)
{
_instance = new ConfigurationManager();
}
return _instance;
}
}
}
}
Factory Method (Фабричный метод)
Паттерн определяет интерфейс для создания объекта и позволяет подклассам изменять тип объекта. Так код получается более гибким и расширяемым.
Пример — проектирование различных типов документов (PDF, Word) в зависимости от входных данных.
public abstract class Document
{
public abstract void Print();
}public class PdfDocument : Document
{
public override void Print() => Console.WriteLine(«Printing PDF document»);
}public class WordDocument : Document
{
public override void Print() => Console.WriteLine(«Printing Word document»);
}public abstract class DocumentFactory
{
public abstract Document CreateDocument();
}public class PdfDocumentFactory : DocumentFactory
{
public override Document CreateDocument() => new PdfDocument();
}public class WordDocumentFactory : DocumentFactory
{
public override Document CreateDocument() => new WordDocument();
}
Observer (Наблюдатель)
Паттерн определяет зависимость типа «один ко многим» между объектами. Когда меняется состояние одного объекта, все зависимые обновляются автоматически.
Это похоже на чат в мессенджере: один объект сообщает, что на сайт выложили новости. Другие реагируют на это сообщение так, как им нужно. В частности, отправляют уведомления пользователям на их смартфоны.
public interface IObserver
{
void Update(string message);
}public class NewsSubscriber : IObserver
{
private string _name;
public NewsSubscriber(string name) => _name = name;public void Update(string message) => Console.WriteLine($»{_name} received news: {message}»);
}public class NewsPublisher
{
private List _subscribers = new List();public void Subscribe(IObserver observer) => _subscribers.Add(observer);
public void Unsubscribe(IObserver observer) => _subscribers.Remove(observer);public void Notify(string message)
{
foreach (var subscriber in _subscribers)
{
subscriber.Update(message);
}
}
}
Decorator (Декоратор)
Паттерн добавляет новые возможности, которых нет в оригинальном объекте. Так его можно менять, а код оставлять таким же.
Пример — текстовый редактор, куда добавили проверку орфографии и форматирование.
public abstract class TextComponent
{
public abstract string GetText();
}public class PlainText : TextComponent
{
private string _text;
public PlainText(string text) => _text = text;
public override string GetText() => _text;
}public abstract class TextDecorator : TextComponent
{
protected TextComponent _component;
public TextDecorator(TextComponent component) => _component = component;
}public class SpellCheckDecorator : TextDecorator
{
public SpellCheckDecorator(TextComponent component) : base(component) { }public override string GetText() => $»{_component.GetText()} (spell-checked)»;
}public class HtmlFormatDecorator : TextDecorator
{
public HtmlFormatDecorator(TextComponent component) : base(component) { }public override string GetText() => $»{_component.GetText()}»;
}
Strategy (Стратегия)
Паттерн определяет семейство алгоритмов и делает их взаимозаменяемыми. С ним можно выбирать конкретный алгоритм, когда программа запущена.
Пример — система расчета стоимости доставки, где используются различные варианты в зависимости от выбранного способа.
public interface IShippingStrategy
{
double CalculateShippingCost(Order order);
}public class RegularShipping : IShippingStrategy
{
public double CalculateShippingCost(Order order) => order.Weight * 0.5;
}public class ExpressShipping : IShippingStrategy
{
public double CalculateShippingCost(Order order) => order.Weight * 1.5;
}public class Order
{
public double Weight { get; set; }
}public class ShippingContext
{
private IShippingStrategy _strategy;
public ShippingContext(IShippingStrategy strategy) => _strategy = strategy;public double CalculateCost(Order order) => _strategy.CalculateShippingCost(order);
}
Научиться применять паттерны программирования можно на курсе «Java-разработчик» от онлайн-университета Skypro. Вы пройдете все этапы обучения и получите нужные навыки, чтобы найти работу после курса.
Главное о паттернах программирования
🟦 Паттерны программирования — это проверенное и устоявшееся решение в разработке, шаблон, который помогает структурировать и улучшать код.
🟦 Такие шаблоны нужны, чтобы стандартизировать решение типичных проблем разработки, улучшать архитектуру кода, облегчать его сопровождение и расширение.
🟦 У паттерна программирования есть имя, задача, мотивация, структура, участники, взаимодействия, последствия, реализация, примеры кода и связанные паттерны.
Добавить комментарий