Я реализовывал шаблон 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, но я мог бы найти другой пример кода таким образом.
Таким образом, вопрос: это все еще реализация фабричного метода? если нет, то почему?
Это очень субъективно, но я бы сказал, что вам не нужно наследование, чтобы оно было фабричным методом. На самом деле этого будет достаточно, чтобы соответствовать определению:
class Book {
}
class BookFactory {
function createBook() {
return new Book();
}
}
Необходимость абстракции (с использованием интерфейса или абстрактного класса) возникает тогда, когда вам нужно изменить код для создания конкретных объектов. Это особенно полезно, когда возникают ситуации, например, при написании юнит-тестов, или вам нужно добавить еще несколько создателей продуктов (и / или).
Интересно знать, что есть разница между фабричным и фабричным методом. Фабрики — это способы инкапсулировать часть создания в класс, имеющий метод, который заботится о части создания. С другой стороны, фабричные методы передаются «Создателям» для создания «Продукта (ов)», который может быть решен создателем. Метод создания Product, скажем, createProduct (), обычно находится внутри Creator (вызывается с помощью наследования), а другие методы обычно предназначены для работы с продуктом, созданным Factory Method.
Теперь и в создателях, и в продуктах мы используем параллельную иерархию, поэтому создатель не зависит (или не знает, как создаются продукты) от конкретных продуктов, а продукты также не знают о создателях. Это помогает в достижении слабосвязанного кода (здесь, CHANGE не влияет друг на друга).
Надеюсь это поможет.
Вы можете прочитать больше на: