Pattern Guru. Шаблоны проектирования. Архитектура ПО
3.15K subscribers
194 photos
4 videos
86 links
Патерны программирования.
Архитектура ПО.
Микросервисы

@anothertechrock
Download Telegram
🚩 Шаблон проектирования Абстрактная фабрика

🟣 Подробное описание паттерна

Шаблон Абстрактная фабрика (англ. Abstract Factory) относится к классу порождающих паттернов. Его основное назначение — предоставить интерфейс для создания семейства взаимосвязанных объектов, не указывая конкретные классы этих объектов.

🟪 Этот шаблон стоит использовать, если:

🔎 Ваша система должна быть независимой от способа создания новых объектов

🔎 Создаваемые объекты должны использоваться вместе и быть взаимосвязанными.

Классы абстрактной фабрики часто реализуются фабричными методами, но могут быть реализованы и с помощью паттерна Prototype.

🗂 Код на Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Паттерны

В одном репозитории собрано 111 паттернов проектирования. На данный момент это самый популярный репозиторий на языке Java, у него почти 50k звёзд.

Для каждого паттерна есть подробное описание и примеры реализации на Java: https://github.com/iluwatar/java-design-patterns

#паттерны #java
#паттерны

Введение

Сегодня мы рассмотрим паттерн проектирования "Абстрактная фабрика".

Классификация

Тип: Порождающий

Определение: Абстрактная фабрика - это порождающий паттерн проектирования, который предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.

Грубо говоря, абстрактная фабрика - это "фабрика фабрик", данный паттерн позволяет решить проблему создания целых семейств связанных объектов, без указания конкретных классов продуктов.
С помощью абстрактной фабрики вы можете предоставить библиотеку объектов не расскрывая их реализацию.

Из чего состоит и как работает данный паттерн

1. Абстрактного класса/Интерфейса абстрактной фабрики. Содержит абстрактные методы которые возвращают абстрактные продукты, связанные одной конпцецией.

class AbstractFactory(ABC):
@abstractmethod
def create_product_a(self):
...

@abstractmethod
def create_product_b(self):
...


2. Конретные фабрики. Конкретные фабрики реализут операции которые создают конкретные продукты.

class ConcreteFactory1(AbstractFactory):
def create_product_a(self):
return ConcreteProductA1()

def create_product_b(self):
return ConcreteProductB1()

class ConcreteFactory2(AbstractFactory):
def create_product_a(self):
return ConcreteProductA2()

def create_product_b(self):
return ConcreteProductB2()


3. Абстрактные классы продуктов. Реализуют интерфейс для всех конретных продуктов своего семейства.

class AbstractProductA(ABC):
@abstractmethod
def very_important_super_function_a(self) -> str:
...

class AbstractProductB(ABC):
@abstractmethod
def very_important_super_function_b(self) -> str:
...


4. Конкретные продукты. Реализуют абстрактные продукты. Продукты одного семейства не могут взаимодействовать, с продуктами другого семейства.

class ConcreteProductA1(AbstractProductA):
def very_important_super_function_a(self) -> str:
return "Product A1"


class ConcreteProductA2(AbstractProductA):
def very_important_super_function_a(self) -> str:
return "Product A2"

class ConcreteProductB1(AbstractProductB):
def very_important_super_function_b(self) -> str:
return "Product B1"


class ConcreteProductB2(AbstractProductB):
def very_important_super_function_b(self) -> str:
return "Product B2"


5. Клиент. Клиентский код работает исключительно с абстрактной фабрикой и абстрактными продуктами.

def client(factory: AbstractFactory) -> str:
return factory.create_product_a().very_important_super_function_a()

for factory in (ConcreteFactory1, ConcreteFactory2, ...):
client(factory)


Плюсы данного паттерна

1. Реализует принцип открытости/закрытости.

2. Упращает поддержку кода.

3. Выделяет код производства продуктов в одно место, упрощая поддержку кода.

Минусы данного паттерна

1. Снижает читаемость программы из-за введения множества дополнительных классов.

Пример и задача

Дед Мороз и Пасхальный кролик не успевают сделать игрушки к празднику, которые они будут дарить детям.
Все существует 3 вида игрушек:

1. Лошадка
2. Зайчик
3. Шарик

Всё было бы просто однако Деду Морозу нужны игрушки в новогоднем стиле, а пасхальному кролику в пасхальном.
Создайте абстрактную фабрику игрушек и спасите эти праздники!

Пример из реального кода

Пример из реального кода предоставил @Tishka17. Он разработал замечательный фреймворк aiogram_dialog для разработки интерактивных диалогов и меню в телеграмм ботах, как обычное приложение с графическим интерфейсом.

Вот здесь он использует данный паттерн: https://github.com/Tishka17/aiogram_dialog/blob/develop/aiogram_dialog/manager/manager_middleware.py#L23

Вот его объяснение, какую задачу он решает в данном случае:
2
🚩 Шаблон проектирования Заместитель

🟣 Подробное описание паттерна

Заместитель (англ. Proxy) — структурный паттерн проектирования. Он позволяет подставлять вместо реальных объектов специальные объекты-заменители. Эти объекты перехватывают вызовы к оригинальному объекту, позволяя сделать что-то до или после передачи вызова оригиналу.

🟪 Ситуации, когда можно использовать паттерн Заместитель:

🔎 Виртуальный proxy является заместителем объектов, создание которых обходится дорого. Реальный объект создается только при первом запросе/доступе клиента к объекту.

🔎 Удаленный proxy предоставляет локального представителя для объекта, который находится в другом адресном пространстве ("заглушки" в RPC и CORBA).

🔎 Защитный proxy контролирует доступ к основному объекту. "Суррогатный" объект предоставляет доступ к реальному объекту, только вызывающий объект имеет соответствующие права.

🔎 Интеллектуальный proxy выполняет дополнительные действия при доступе к объекту.

🗂 Код на Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Паттерн Singletone с примером на JavaScript

Несмотря на то что в последнее время все больше задач мы обычно решаем в функциональном стиле я хотел бы сегодня вам рассказать о одном из самых распространенных классовых паттернов - синглтон.

И так что это:
Паттерн Singleton означает создание только одного экземпляра класса и доступ к нему через методы-геттеры.

Пример использования:

class Singleton {
 constructor() {
  if (!Singleton.instance) {
   Singleton.instance = this;
  }
  return Singleton.instance;
 }

 someMethod() {
  console.log('Hello from Singleton!');
 }
}

const instance1 = new Singleton();
const instance2 = new Singleton();

instance1.someMethod(); // "Hello from Singleton!"
console.log(instance1 === instance2); // true

В данном примере класс Singleton будет создавать только один экземпляр и все вызовы конструктора будут возвращать ссылку на этот экземпляр. Таким образом, мы можем быть уверены, что где бы ни встретились вызовы методов класса Singleton, они всегда будут работать с одним и тем же экземпляром.
👍1
Паттерн Singletone с примером на JavaScript

Несмотря на то что в последнее время все больше задач мы обычно решаем в функциональном стиле я хотел бы сегодня вам рассказать о одном из самых распространенных классовых паттернов - синглтон.

И так что это:
Паттерн Singleton означает создание только одного экземпляра класса и доступ к нему через методы-геттеры.

Пример использования:

class Singleton {
 constructor() {
  if (!Singleton.instance) {
   Singleton.instance = this;
  }
  return Singleton.instance;
 }

 someMethod() {
  console.log('Hello from Singleton!');
 }
}

const instance1 = new Singleton();
const instance2 = new Singleton();

instance1.someMethod(); // "Hello from Singleton!"
console.log(instance1 === instance2); // true

В данном примере класс Singleton будет создавать только один экземпляр и все вызовы конструктора будут возвращать ссылку на этот экземпляр. Таким образом, мы можем быть уверены, что где бы ни встретились вызовы методов класса Singleton, они всегда будут работать с одним и тем же экземпляром.
🔥Приглашаем на бесплатный урок курса «Архитектор программного обеспечения»:
«API Gateway и не только: шаги к идеальной архитектуре внешних API»

🎓Мы разберём продуманную архитектуру внешних API: какие проблемы возникают при их проектировании, как API Gateway помогает их решать и какие паттерны стоит применять, чтобы сделать взаимодействие с системой удобным, безопасным и масштабируемым.

📚Вопросы вебинара:

- Сложности проектирования API
- Нестабильные каналы, перегрузка, вопросы безопасности и производительности
- Зачем нужен API Gateway
- Проектирование
- Популярные решения и подходы
- Агрегация, адаптация и переиспользование API
- Антипаттерны и типичные ошибки

👉 Регистрация https://otus.pw/szNj/

Реклама ООО «Отус онлайн-образование», ОГРН 1177746618576
👍1🔥1
🕯 Паттерн Proxy (Прокси)

Proxy — это структурный паттерн, который предоставляет объект-заместитель для управления доступом к другому объекту, обеспечивая контроль над его использованием.

Использование:

🔹 Когда необходимо контролировать доступ к ресурсоемким объектам или операциям.
🔹 Для добавления дополнительной функциональности без изменения исходного объекта.

Преимущества:

1⃣ Позволяет контролировать доступ к реальному объекту, например, для ленивой инициализации или кэширования. Это может улучшить производительность, так как ресурсоемкие объекты создаются только тогда, когда они действительно нужны.

2⃣ Позволяет контролировать доступ к объектам, добавляя проверки перед вызовом методов. Это полезно для управления доступом в сетевых приложениях или для защиты данных.

3⃣ Позволяет оптимизировать работу с удаленными объектами, минимизируя количество вызовов или обрабатывая их асинхронно. Это снижает нагрузку на систему и повышает скорость работы приложения.

4⃣ Может использоваться для логирования или отслеживания вызовов методов реального объекта, не внося изменений в сам объект. Это упрощает мониторинг и отладку системы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31
🔥 Приглашаем на бесплатный открытый вебинар курса «Высоконагруженные системы: архитектура и масштабирование»:

«Polyglot Persistence: как современные системы живут с десятками баз данных»

🗓 Когда: 2 июня, 20:00 (мск)

Одной базы данных уже давно недостаточно. Современные высоконагруженные системы — это сложная экосистема из разных хранилищ, каждое из которых решает свою задачу.

На вебинаре разберём, как грамотно сочетать PostgreSQL, ClickHouse, Redis, Kafka и Elasticsearch, чтобы система оставалась быстрой, согласованной и отказоустойчивой.

Что будет на вебинаре:
— Принципы Polyglot Persistence и роль каждой базы в современной архитектуре
— Как связать PostgreSQL, ClickHouse, Redis и Kafka без потери согласованности данных
— Event-driven подход, CDC и Outbox-паттерн в высоконагруженных системах
— Архитектурные приёмы построения надёжных data-платформ, способных выдерживать миллионы операций

Кому будет полезно:
— Backend-разработчикам, желающим понимать устройство современных систем
— Архитекторам и DevOps-инженерам, решающим задачи масштабирования и согласованности
— Всем, кто работает с большими данными и хочет эффективно комбинировать разные типы хранилищ

👉 Зарегистрироваться: https://vk.cc/cYdHaS

Бесплатное занятие приурочено к курсу «Highload Architect», на котором вы научитесь проектировать сложные высоконагруженные системы, грамотно выбирать и сочетать технологии хранения и обработки данных.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
1👍1
🚩 Шаблон проектирования Декоратор

🟣 Подробное описание паттерна

Структурный паттерн Декоратор (англ. Decorator) позволяет расширять функциональность без использования наследования.

Дело в том, что механизм наследования имеет несколько проблем:

1⃣ Он статичный, т.е. не дает возможности менять поведение уже существующего объекта.
2⃣ Он не позволяет наследовать поведение нескольких классов одновременно.

Декоратор позволяет обойти эти проблемы. Суть этого шаблона отлично передает его второе название — "обертка". Вы помещаете один объект в другой — обертку. Обертка запускает базовое поведение объекта, а затем что-то добавляет к нему.

🗂 Код на Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
5