Патерн (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).