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();
}
}
Такой подход облегчает расширение системы и поддержку разных платформ.