Sobes.tech
Назад к вопросам
Senior
4

Можете рассказать про паттерн Абстрактная фабрика?

Компании, где спрашивали
Octo

Ответ от нейросети

sobes.tech AI

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

Основная идея — отделить код, который использует объекты, от кода, который их создает, позволяя менять семейства продуктов, не меняя клиентский код.

Компоненты паттерна:

  • Абстрактная фабрика: интерфейс для создания абстрактных продуктов.
  • Конкретные фабрики: реализуют интерфейс, создавая конкретные продукты.
  • Абстрактные продукты: интерфейсы для разных типов продуктов.
  • Конкретные продукты: реализации абстрактных продуктов.
  • Клиент: использует фабрику для создания продуктов через абстрактные интерфейсы.

Пример на Java:

// Абстрактные продукты
interface Button {
    void paint();
}

interface Checkbox {
    void paint();
}

// Конкретные продукты для Windows
class WindowsButton implements Button {
    public void paint() {
        System.out.println("Рисуем кнопку Windows");
    }
}

class WindowsCheckbox implements Checkbox {
    public void paint() {
        System.out.println("Рисуем чекбокс Windows");
    }
}

// Конкретные продукты для Mac
class MacButton implements Button {
    public void paint() {
        System.out.println("Рисуем кнопку Mac");
    }
}

class MacCheckbox implements Checkbox {
    public void paint() {
        System.out.println("Рисуем чекбокс Mac");
    }
}

// Абстрактная фабрика
interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

// Конкретные фабрики
class WindowsFactory implements GUIFactory {
    public Button createButton() {
        return new WindowsButton();
    }
    public Checkbox createCheckbox() {
        return new WindowsCheckbox();
    }
}

class MacFactory implements GUIFactory {
    public Button createButton() {
        return new MacButton();
    }
    public Checkbox createCheckbox() {
        return new MacCheckbox();
    }
}

// Клиент
class Application {
    private Button button;
    private Checkbox checkbox;

    public Application(GUIFactory factory) {
        button = factory.createButton();
        checkbox = factory.createCheckbox();
    }

    public void paint() {
        button.paint();
        checkbox.paint();
    }
}

// Использование
public class Demo {
    public static void main(String[] args) {
        GUIFactory factory;
        String osName = System.getProperty("os.name").toLowerCase();
        if (osName.contains("win")) {
            factory = new WindowsFactory();
        } else {
            factory = new MacFactory();
        }
        Application app = new Application(factory);
        app.paint();
    }
}

Такой подход позволяет легко расширять систему новыми семействами продуктов, не меняя клиентский код.