Sobes.tech
Back to questions
Junior — Middle
75

Можете объяснить концепцию абстрактной фабрики и как она применяется в проектировании систем?

Companies where asked
СБЕРСБЕР

Answer from AI

sobes.tech AI

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

Это полезно, когда система должна работать с разными наборами продуктов, но не должна зависеть от конкретных реализаций.

Пример применения:

  • В графическом интерфейсе можно иметь абстрактную фабрику для создания кнопок и окон для разных операционных систем (Windows, MacOS, Linux).
  • Клиентский код использует интерфейс фабрики, не зная, какая конкретно реализация создаётся.

Пример на Java:

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

interface Window {
    void render();
}

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

class WindowsWindow implements Window {
    public void render() {
        System.out.println("Рендерим окно Windows");
    }
}

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

class MacOSWindow implements Window {
    public void render() {
        System.out.println("Рендерим окно MacOS");
    }
}

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

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

class MacOSFactory implements GUIFactory {
    public Button createButton() {
        return new MacOSButton();
    }
    public Window createWindow() {
        return new MacOSWindow();
    }
}

// Клиентский код
class Application {
    private Button button;
    private Window window;

    public Application(GUIFactory factory) {
        button = factory.createButton();
        window = factory.createWindow();
    }

    public void paint() {
        button.paint();
        window.render();
    }
}

// Использование
public class Demo {
    public static void main(String[] args) {
        GUIFactory factory = new WindowsFactory(); // или new MacOSFactory();
        Application app = new Application(factory);
        app.paint();
    }
}

Такой подход облегчает расширение системы и поддержку разных платформ.