Метод фабрики с неабстрактным продуктом

Я реализовывал шаблон Factory Method, но проверяя несколько примеров там, я не мог определить, является ли правильным расширение конкретного класса для продукта вместо создания абстрактного класса или интерфейса … Это просто предназначено для примера (PHP) ,

Итак, у меня есть моя абстрактная фабрика и их конкретные фабрики:

interface BookFactoryInterface
{
public function createBook();
}

class ElectronicBookFactory implements BookFactoryInterface
{
public function createBook()
{
return new ElectronicBook();
}
}

class PaperBookFactory implements BookFactoryInterface
{
public function createBook()
{
return new PaperBook();
}
}

Теперь, что я видел во всех примерах, это то, что обычно продукты берут начало от абстрактного класса или интерфейса, но когда я тестировал, я понял, что в моем случае в этом не было необходимости, мне нужен был конкретный класс с общее поведение, а затем мои подклассы с остальными.

class Book
{
/*
All properties like title, authors, publicationDate
here, with the corresponding methods.
*/
}

class ElectronicBook extends Book
{
//...
}

class PaperBook extends Book
{
//...
}

Реализация класса все еще наследуется от подклассов, поэтому я действительно верил, что это реализация Factory Method, но я мог бы найти другой пример кода таким образом.

Таким образом, вопрос: это все еще реализация фабричного метода? если нет, то почему?

0

Решение

Это очень субъективно, но я бы сказал, что вам не нужно наследование, чтобы оно было фабричным методом. На самом деле этого будет достаточно, чтобы соответствовать определению:

class Book {

}

class BookFactory {

function createBook() {

return new Book();

}

}
0

Другие решения

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

Интересно знать, что есть разница между фабричным и фабричным методом. Фабрики — это способы инкапсулировать часть создания в класс, имеющий метод, который заботится о части создания. С другой стороны, фабричные методы передаются «Создателям» для создания «Продукта (ов)», который может быть решен создателем. Метод создания Product, скажем, createProduct (), обычно находится внутри Creator (вызывается с помощью наследования), а другие методы обычно предназначены для работы с продуктом, созданным Factory Method.

Теперь и в создателях, и в продуктах мы используем параллельную иерархию, поэтому создатель не зависит (или не знает, как создаются продукты) от конкретных продуктов, а продукты также не знают о создателях. Это помогает в достижении слабосвязанного кода (здесь, CHANGE не влияет друг на друга).

Надеюсь это поможет.

Вы можете прочитать больше на:

1

По вопросам рекламы [email protected]