OO Design проблема - это анти-шаблон или подходящее место для шаблона / техники, о которой я не знаю? - PullRequest
0 голосов
/ 11 декабря 2011

В настоящее время я заканчиваю проект на PHP, но общие принципы ОО по-прежнему применяются.

У меня есть родительский класс с именем Node, который является абстрактным, то есть его нельзя создать.Есть много классов, которые расширяют Node и являются экземплярами.Некоторые из них включают Event, Person и Project.

Проблема, с которой я сталкиваюсь, заключается в том, что мне часто нужно создавать экземпляры Node, не зная, какой это будет дочерний класс.Все Node и node-sub-классы всегда принимают один и тот же тип объекта (строку из базы данных) в качестве аргумента для конструктора.Чтобы обойти проблему незнания того, какой тип реализации мне нужен, я создал простой статический класс, который будет возвращать правильный подкласс узла.Пример этого кода выглядит следующим образом:

<?php

class NodeClassRegistry{

    public static function init_class($node) {
        switch ($node->type) {
            case 'person':
                return new Person($node);

            case 'event':
                return new Event($node);
        }
    }

}

?>

Мне кажется, это очень плохой дизайн - это своего рода фабричный шаблон, но он действительно привязан к глобальному состоянию.Есть ли шаблон проектирования, который подойдет для этой ситуации?

Ответы [ 3 ]

2 голосов
/ 11 декабря 2011

То, что вы делаете, является специальным типом шаблона проектирования Factory Method Пример C ++ для этого подтипа в GoF book следующий:

class Creator {
public:
  virtual Product* Create(ProductId id);
}

Product* Creator::Create(ProductId id) {
  if (id == MINE) return new MyProduct;
  if (id == YOURS) return new YourProduct;
  ...
  return 0;
}
0 голосов
/ 11 декабря 2011

В C # я бы сохранил полное имя класса в столбце и создал бы его, используя отражение. Если моя память работает правильно, я мог бы применить «соглашение о конфигурации», то есть:

Создание классов, имя которых равно значениям, найденным в столбце типа

Затем создайте функцию, сделанную следующим образом:

public static function init_class($node) {
    $item = NULL;
    eval "\$item = new " . $node->type . "(\$node);"
    return $item;
}
0 голосов
/ 11 декабря 2011

Это Абстрактная фабрика шаблон проектирования, и вполне нормально зависеть от какого-то type поля / переменной, чтобы проверить экземпляр того, какой базовый тип должен быть создан фабрикой. См. Пример реализации Abstract Factory на языке Java: чтение глобальной переменной из файла конфигурации ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...