Назад к вопросам
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();
}
}
Такой подход позволяет легко расширять систему новыми семействами продуктов, не меняя клиентский код.