Middle
Каква е разликата между патърна 'фабрика' и 'фабричния метод'?
sobes.tech AI
Отговор от 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) |
|---|---|---|
| Отговорност | Един клас или статична функция създава обекти. | Подкласовете определят типа на създавания обект. |
| Гъвкавост | Ограничена. Изисква промени в фабричния клас при добавяне на нов тип продукт. | Висока. Лесно се разширява чрез добавяне на нови подкласове създатели. |
| Наследяване | Обикновено не се използва или се използва за създаване на една фабрика. | Зависимостта от наследяването за определяне на типа на създавания обект. |
| Ниво на абстракция | По-малко абстрактен. | По-абстрактен. |
| Цел | Централизирано създаване на обекти. | Делегиране на създаването на обекти към подкласове. |