Skip to content

Урок 2. Абстрактная фабрика (Abstract Factory)

Тема: Паттерн проектирования "Абстрактная фабрика" (Abstract Factory) Введение

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

Продукты:
    Продукты представляют собой объекты, которые создаются фабрикой. Они могут быть связаны между собой и могут иметь разные реализации.

Абстрактная фабрика:
    Абстрактная фабрика определяет интерфейсы для создания различных продуктов. Каждая конкретная фабрика реализует этот интерфейс и создает конкретные продукты.

Конкретные фабрики:
    Конкретные фабрики реализуют методы абстрактной фабрики и создают конкретные экземпляры продуктов.

Преимущества использования паттерна "Абстрактная фабрика"

Изоляция кода: Код, использующий фабрики, не зависит от конкретных классов продуктов, что упрощает его поддержку и расширение.
Легкость в добавлении новых семейств продуктов: Добавление новых семейств продуктов не требует изменения существующего кода.
Гармония продуктов: Гарантирует, что создаваемые продукты совместимы друг с другом.

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

Рассмотрим пример, где у нас есть два семейства продуктов: Chair (стул) и Table (стол). У нас будут два типа мебели: Victorian и Modern. Мы создадим абстрактную фабрику для создания этих объектов.

// Продукты
interface Chair {
    void sitOn();
}

interface Table {
    void eatOn();
}

// Конкретные продукты
class VictorianChair implements Chair {
    public void sitOn() {
        System.out.println("Sitting on a Victorian chair.");
    }
}

class ModernChair implements Chair {
    public void sitOn() {
        System.out.println("Sitting on a modern chair.");
    }
}

class VictorianTable implements Table {
    public void eatOn() {
        System.out.println("Eating on a Victorian table.");
    }
}

class ModernTable implements Table {
    public void eatOn() {
        System.out.println("Eating on a modern table.");
    }
}

// Абстрактная фабрика
interface FurnitureFactory {
    Chair createChair();
    Table createTable();
}

// Конкретные фабрики
class VictorianFurnitureFactory implements FurnitureFactory {
    public Chair createChair() {
        return new VictorianChair();
    }

    public Table createTable() {
        return new VictorianTable();
    }
}

class ModernFurnitureFactory implements FurnitureFactory {
    public Chair createChair() {
        return new ModernChair();
    }

    public Table createTable() {
        return new ModernTable();
    }
}

// Использование фабрики
public class Main {
    public static void main(String[] args) {
        FurnitureFactory factory;

        // Выбор типа фабрики
        String style = "modern"; // или "victorian"
        if (style.equals("victorian")) {
            factory = new VictorianFurnitureFactory();
        } else {
            factory = new ModernFurnitureFactory();
        }

        // Создание продуктов
        Chair chair = factory.createChair();
        Table table = factory.createTable();

        // Использование продуктов
        chair.sitOn();
        table.eatOn();
    }
}

Заключение

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

пример

https://gitlab.com/synergy9980417/razdel2/7_2