Фабрика / Абстрактная фабрика путаница - PullRequest
14 голосов
/ 18 января 2011

После ~ 10 месяцев процедурного PHP я сейчас пытаюсь обдумать основные принципы ООП и шаблоны проектирования.Это хобби, и у меня не так много времени, как я хотел бы заняться им, поэтому, пожалуйста, простите за довольно низкий уровень этого вопроса.

Мой сайт (в настоящее время 100% процедурный) находится наСердце библиотеки.Посетители отправляют сценарию библиотеки 2 точки данных - элемент type и элемент code.

Library.php использует тип элемента для выбора включения, а включающий захватывает код для попадания в базу данных, а затем создаетстраницы.

Некоторые примеры:

[type]  [code]
 game    RoTo
 map     32
 unit    216

Пример ссылки будет library.php?type=game&code=RoTo

Все работает хорошо, как есть, но как только я начинаю с ООП, я вижуочевидные простые точки входа и пути наследования для «объективации» этой системы.

class LibraryObject
{
    protected $_name;
    protected $_description;
}

class Game extends LibraryObject
{
    protected $_releaseDate;
    etc.
}

Я также воодушевлен гибкостью, которую мне дадут некоторые хорошо написанные классы.

Идея шаблона проектированиявсе же сбивает меня с толку.Это похоже на шаблон Factory, но меня смущают различия между F и AF .Я читал другие вопросы SO, специально задавая этот вопрос, и я читал примеры на OODesign , но я чувствую, что они написаны на другом языке, и это довольно разочаровывает.

Возможно, если бы кто-то мог объяснить это, используя мои собственные структуры данных, это было бы для меня более логично?

Извините за беспокойство.

Ответы [ 2 ]

33 голосов
/ 18 января 2011

Разница между Factory и Abstract Factory довольно проста.В последнем случае сама фабрика является абстрактной (!) И не может быть создана непосредственно, но должна быть подклассифицирована.

Для каждого примера фабрика:

class Document {
   public function createPage() {
       return new Page;
   }
}

class LandscapeDocument extends Document {
   public function createPage() {
       return new LandscapePage;
   }
}

В абстрактной фабрике:

abstract class Document {
   abstract public function createPage();
}

class PortraitDocument extends Document {
   public function createPage() {
      return new PortraitPage;
   }
}

class LandscapeDocument extends Document {
   public function createPage() {
      return new LandscapePage;
   }
}

Короче говоря, шаблон Factory имеет реализацию по умолчанию в самом классе Factory.Абстрактная фабрика требует, чтобы все подклассы реализовали свою собственную версию фабричных методов.

Это все, что нужно.

1 голос
/ 20 января 2015

Вот еще один способ взглянуть на это:

Чтобы очистить кусты: Фабричный образец - это творческий образец.То есть он используется для создания экземпляров для использования.

Шаблон фабрики

  • Шаблон создания, в котором логика создания экземпляра заключается вруки заводского класса.
  • Фабричный шаблон создает только один тип экземпляра объекта.В вашем случае он будет создавать объекты типа LibraryObject , предполагая, что LibraryObject является самым верхним объектом в иерархическом дереве.*
    • Шаблон создания, в котором логика создания экземпляра находится в руках классов, которые реализуют интерфейс фабрики / абстрактный класс .
    • Шаблон Abstract Factory может создавать объекты различных типов, поэтому вы можете использовать конкретные реализации интерфейса / абстрактного класса Factory для создания объектов нужных вам типов.Вот почему он называется Фабрика Фабрик.

    Хорошей ссылкой будет эта ссылка ниже, я бы посоветовал вам также прочитать шаблон Фабрика Метод:http://www.oodesign.com/creational-patterns/

...