Назад к вопросам
Middle
94
questionbank

В чем различие между паттерном 'фабрика' и 'фабричным методом'?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

Паттерн "Фабрика" (Simple Factory) отвечает за создание объектов одного типа, скрывая логику их инстанцирования. Он представляет собой отдельный класс или статическую функцию, которая на основе входных параметров создает и возвращает конкретный объект.

<?php

class ProductA {}
class ProductB {}

class ProductFactory
{
    public static function createProduct(string $type)
    {
        switch ($type) {
            case 'A':
                return new ProductA();
            case 'B':
                return new ProductB();
            default:
                throw new \InvalidArgumentException("Invalid product type");
        }
    }
}

Паттерн "Фабричный метод" (Factory Method) является порождающим паттерном проектирования, который определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс инстанцировать. Он перекладывает ответственность за создание объектов на дочерние классы.

<?php

interface Product
{
    public function operation(): string;
}

class ConcreteProductA implements Product
{
    public function operation(): string
    {
        return "Result of ConcreteProductA";
    }
}

class ConcreteProductB implements Product
{
    public function operation(): string
    {
        return "Result of ConcreteProductB";
    }
}

abstract class Creator
{
    abstract public function factoryMethod(): Product;

    public function someOperation(): string
    {
        // Call the factory method to create a Product object.
        $product = $this->factoryMethod();
        // Now, use the product.
        return "Creator: The same creator's code has just worked with " . $product->operation();
    }
}

class ConcreteCreatorA extends Creator
{
    public function factoryMethod(): Product
    {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB extends Creator
{
    public function factoryMethod(): Product
    {
        return new ConcreteProductB();
    }
}

Основное различие заключается в следующем:

Характеристика Паттерн "Фабрика" (Simple Factory) Паттерн "Фабричный метод" (Factory Method)
Ответственность Один класс или статическая функция создает объекты. Дочерние классы определяют тип создаваемого объекта.
Гибкость Ограниченная. Требует изменения фабричного класса при добавлении нового типа продукта. Высокая. Легко расширяется путем добавления новых дочерних классов-создателей.
Наследование Обычно не используется или используется для создания одной фабрики. Полагается на наследование для определения того, какой объект создавать.
Уровень абстракции Менее абстрактный. Более абстрактный.
Цель Централизованное создание объектов. Делегирование создания объектов подклассам.