Middle
Koja je razlika između obrasca 'fabrika' i 'fabricki metod'?
sobes.tech АИ
Одговор од АИ
Шаблонът "Фабрика" (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) |
|---|---|---|
| Отговорност | Един клас или статична функция създава обекти. | Подкласовете определят типа на създавания обект. |
| Гъвкавост | Ограничена. Изисква промени в фабричния клас при добавяне на нов тип продукт. | Висока. Лесно се разширява чрез добавяне на нови подкласове създатели. |
| Наследяване | Обикновено не се използва или се използва за създаване на една фабрика. | Зависимостта от наследяването за определяне на типа на създавания обект. |
| Ниво на абстракция | По-малко абстрактен. | По-абстрактен. |
| Цел | Централизирано създаване на обекти. | Делегиране на създаването на обекти към подкласове. |