TGViewer
PHP | Вопросы собесов PHP | Вопросы собесов @easy_php_ru · 2.31K subscribers
Post #2247 373
🤔 Расскажи про фабрики

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

🚩Зачем нужны фабрики?

🟠Инкапсуляция процесса создания объектов
Если создание объекта требует сложной логики или конфигурации, фабрика позволяет скрыть эту сложность от остальной части кода.

🟠Снижение зависимости от конкретных классов
Вы используете интерфейсы или абстрактные классы вместо конкретных реализаций. Это упрощает замену одного типа объекта на другой.

🟠Гибкость и расширяемость
Фабрики позволяют добавлять новые классы без изменения существующего кода.

🚩Типы фабрик

🟠Простая фабрика (Simple Factory)
Это метод, который возвращает объект одного из нескольких возможных классов в зависимости от переданных параметров.

   class ShapeFactory {
public static function createShape(string $type) {
return match ($type) {
'circle' => new Circle(),
'square' => new Square(),
default => throw new Exception("Unknown shape type"),
};
}
}

$circle = ShapeFactory::createShape('circle'); // Возвращает объект Circle


🟠Фабричный метод (Factory Method)
В этом шаблоне создание объекта делегируется подклассам. Основной класс определяет интерфейс для создания объектов, но сам не знает, какие конкретные классы будут созданы.

   interface Logger {
public function log(string $message);
}

class FileLogger implements Logger {
public function log(string $message) {
echo "Logging to a file: $message";
}
}

class DatabaseLogger implements Logger {
public function log(string $message) {
echo "Logging to a database: $message";
}
}

abstract class LoggerFactory {
abstract public function createLogger(): Logger;
}

class FileLoggerFactory extends LoggerFactory {
public function createLogger(): Logger {
return new FileLogger();
}
}

$factory = new FileLoggerFactory();
$logger = $factory->createLogger();
$logger->log("Hello World");


🟠Абстрактная фабрика (Abstract Factory)
Этот шаблон используется для создания семейств взаимосвязанных объектов.

   interface GUIFactory {
public function createButton(): Button;
public function createCheckbox(): Checkbox;
}

class WindowsFactory implements GUIFactory {
public function createButton(): Button {
return new WindowsButton();
}
public function createCheckbox(): Checkbox {
return new WindowsCheckbox();
}
}

class MacOSFactory implements GUIFactory {
public function createButton(): Button {
return new MacOSButton();
}
public function createCheckbox(): Checkbox {
return new MacOSCheckbox();
}
}

$factory = new WindowsFactory();
$button = $factory->createButton();
$checkbox = $factory->createCheckbox();


🚩Как использовать фабрики?

Если вы работаете с приложением, где объекты часто меняются, например, в зависимости от окружения (Windows, MacOS).
Когда создание объектов сложное и требует дополнительной логики.
Когда нужно уменьшить зависимость между модулями.

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
More from @easy_php_ru
  1. Oct 12, 2026🤔 Что такое инкремент и декремент? Инкремент (`++`) и декремент (`--`) — это операции в P…
  2. Oct 12, 2026🤔 Как устроен типичный тест на opening point? Тест на Opening Point (OP-тест) используетс…
  3. Oct 11, 2026🤔 Для чего нужен middleware? Middleware — это промежуточный слой между запросом клиента и…
  4. Oct 11, 2026🤔 Что такое декремент? декремент — это операция, используемые для увеличения или уменьшен…
  5. Oct 10, 2026🤔 Что такое агрегатные функции? Агрегатные функции в SQL и других языках обработки данных…
  6. Oct 9, 2026🤔 Как настроить autoload через Composer? Composer предоставляет механизм автоматической з…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →