Дисклеймер

Інформація на сайті tseivo.com є суб'єктивною та відображає особисті погляди та досвід авторів та авторок блогів.

Використовуйте цей ресурс як одне з декількох джерел інформації під час своїх досліджень та прийняття рішень. Завжди застосовуйте критичне мислення. Людина сама несе відповідальність за свої рішення та дії.

Що таке патерн/шаблон проєктування?

Патерн (pattern) проєктування (або шаблон проєктування) - це загальний спосіб вирішення типових проблем при розробці програмного забезпечення. Використання патернів проєктування дозволяє розробникам використовувати передбачувані та ефективні рішення для конкретних завдань. Розглянемо приклади популярних патернів проєктування нижче.

Singleton

Singleton є одним з патернів проєктування, і його основна ідея полягає в тому, щоб клас мав тільки один екземпляр, і надає глобальну точку доступу до цього екземпляра. Це корисно, коли точно один об'єкт повинен координувати дії багатьох інших об'єктів.
class Singleton
  # Змінна для зберігання єдиного екземпляра
  @instance = nil

  # Приватний конструктор, щоб заборонити створення екземплярів ззовні класу
  private_class_method def initialize
    # Ініціалізація екземпляру
  end

  # Глобальна точка доступу до єдиного екземпляра
  def self.instance
    @instance ||= new
  end
end

Для чого може бути потрібен сінглтон клас?

Клас конфігурації
Якщо у вас є клас, який зберігає конфігураційні налаштування для вашого додатку, використання сінглтону дозволяє забезпечити глобальний доступ до цього класу конфігурації. Таким чином, усі частини програми можуть легко отримувати доступ до одного екземпляра для отримання конфігурацій.
Менеджер підключень до бази даних
У великих програмах може бути потрібно керувати підключеннями до бази даних. Сінглтон може використовуватися для створення і управління пулом з'єднань до бази даних, забезпечуючи централізований доступ до цих ресурсів.
Логгер
Клас, що веде журнал подій або відстежує інформацію про помилки, може бути реалізований як сінглтон. Це дозволяє всім компонентам додатку легко реєструвати події та помилки у єдиний лог-файл чи іншу систему.
Менеджер ресурсів:
Якщо ваша програма працює з обмеженими ресурсами (наприклад, з пулом з'єднань до API), сінглтон може бути використаний для керування доступом та використанням цих ресурсів.
Кеш:
Сінглтон може бути використаний для реалізації механізму кешування даних. У цьому випадку, він зберігає кешовані дані та надає зручний спосіб для отримання чи оновлення цих даних.
Та для інших специфічних потреб...

Фабричний метод (Factory Method)

Фабричний метод (Factory Method) - це породжуючий патерн проєктування, який надає інтерфейс для створення об'єктів у суперкласі, але дозволяє підкласам змінювати тип створюваних об'єктів.
Основна ідея полягає в тому, щоб визначити інтерфейс для створення об'єкта, але залишити саме створення об'єкта підкласам, залежно від контексту чи умов використання.
Основні елементи у патерні:
  • Продукт (Product) - інтерфейс або абстрактний клас, який визначає об'єкт, який буде створюватися фабричним методом.
  • Конкретний продукт (Concrete Product) - конкретна реалізація об'єкта, який створюється фабричним методом.
  • Творець (Creator): Це абстрактний клас або інтерфейс, який визначає фабричний метод. Зазвичай містить інші методи для роботи зі створеним об'єктом.
  • Конкретний творець (Concrete Creator): Реалізація творця, яка конкретно реалізує фабричний метод для створення конкретного продукту.
Приклад фабричного методу може бути, наприклад, в графічному редакторі. Спробуймо представити ситуацію, де є клас Document і його підкласи TextDocument та ImageDocument. Ми можемо визначити фабричний метод у класі DocumentCreator, який буде містити логіку створення конкретних продуктів (TextDocument чи ImageDocument). Кожен конкретний творець реалізує фабричний метод відповідно до своїх потреб.
# Продукт
class Document
  def display
    raise NotImplementedError, "Subclasses must implement the display method."
  end
end

# Конкретний продукт
class TextDocument < Document
  def display
    puts "Displaying text document."
  end
end

# Конкретний продукт
class ImageDocument < Document
  def display
    puts "Displaying image document."
  end
end

# Творець
class DocumentCreator
  def create_document
    raise NotImplementedError, "Subclasses must implement the create_document method."
  end
end

# Конкретний творець
class TextDocumentCreator < DocumentCreator
  def create_document
    TextDocument.new
  end
end

# Конкретний творець
class ImageDocumentCreator < DocumentCreator
  def create_document
    ImageDocument.new
  end
end

# Використання фабричного методу
text_creator = TextDocumentCreator.new
text_document = text_creator.create_document
text_document.display

image_creator = ImageDocumentCreator.new
image_document = image_creator.create_document
image_document.display
У цьому прикладі DocumentCreator є абстрактним творцем, а TextDocumentCreator та ImageDocumentCreator є конкретними творцями. Кожен конкретний творець реалізує фабричний метод create_document для створення відповідного продукту (TextDocument або ImageDocument).

🙌 Підтримати блог @memecode

Ви можете поширити цей допис у соцмережах, чим допоможете платформі цейво розвиватись (* ^ ω ^)

📝 Більше публікацій: