3

Мне нужен фабричный объект, способный создавать несколько объектов, но впрыскивать в них другие объекты. Например:Объект объекта, создающий объекты, которым нужны другие объекты

class MyFactory 
{ 
    public function createObjectA() { 
    return new ObjectA(new ObjectANeededObject1(), new ObjectANeededObject1()); 
    } 

    public function createObjectB() { 
    return new ObjectB(new ObjectBNeededObject1(), new ObjectBNeededObject1()); 
    } 
} 

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

Что вы посоветуете?

Спасибо,

Бен

+2

Когда вы начали читать о [контейнерах для инъекций зависимостей] (http://www.phptherightway.com/#containers) (DIC) –

+0

Спасибо, Марк. Если я хорошо понимаю, контейнер поможет нам создать мои разные объекты ObjectXNeddedObjectY. Но если я не ошибаюсь, это та же проблема, я читал, что я не должен давать свой контейнер всем объектам, а просто передавать объекты, созданные контейнером. Так должен ли я передать все мои объекты ObjectXNeddedObjectY (созданные моим контейнером) на мою фабрику? –

+0

DIC должен возвращать коллекцию объектов, относящихся к классу, который должен быть создан, и фабрика может затем использовать отражение, чтобы создать экземпляр этого класса с помощью коллекции, например: http://www.php.net/manual/ ru/reflectionclass.newinstanceargs.php' –

ответ

0

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

ОБНОВЛЕНО

class MyFactory 
{ 
    public static function createObjectA($object1, $object2) { 
    return new ObjectA($object1, $object2); 
    } 

    public static function createObjectB($object1, $object2) { 
    return new ObjectB($object1, $object2); 
    } 
} 

$objectA = MyFactory->createObjectA(new ObjectANeededObject1(), new ObjectANeededObject1()); 
$objectB = MyFactory->createObjectB(new ObjectANeededObject1(), new ObjectANeededObject1()); 
+0

Спасибо Halayem. Но мне не нравится, что клиент завода должен знать, какие объекты необходимы фабрике, чтобы создать желаемый объект. Например, если клиент является классом Workflow, который должен работать с несколькими типами «шагов рабочего процесса», если для одного из этих шагов требуется, например, объект HttpRequest, поэтому мой объект рабочего процесса будет содержать как фабрику, способную создавать этапы, так и HttpRequest. –

+0

То, что вы предлагаете, не имеет смысла и поражает цель фабрики ... », потому что, если конструктор изменится, вы также вернетесь к тому, что ...», если вы думаете об этом, это на самом деле аргумент против сдачи клиент напрямую управляет конкретными классами. – plalx

Смежные вопросы