3

여러 객체를 만들 수 있지만 다른 객체를 삽입 할 수있는 팩토리 객체가 필요합니다. 예를 들어 :다른 객체가 필요한 객체를 만드는 팩토리 객체

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

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

내 공장은 또한 필요한 개체를 인스턴스화해야는 (내 공장은 모든 개체를 만들 수 있습니다 고려)? 팩터 생성자에 주입하여 전달해야하나요 (생성자에는 많은 매개 변수가 많이 포함될 것입니다)? 매개 변수로 팩토리 메서드에 전달해야합니까? (그러나 팩토리 클라이언트는 만들 개체를 만들어야하며이를 알지 못합니다)? 공장에서 직접 객체 대신 객체 작성자 (내 객체 및 필수 객체를 생성 할 수 있어야 함)를 작성해야합니까?

어떤 것이 좋습니다?

벤 감사

+2

시 료시 [Dependency Injection Containers] (http://www.phptherightway.com/#containers) (DIC) –

+0

Mark 감사합니다. 만약 내가 잘 이해한다면, 컨테이너는 우리가 다른 객체 인 ObjectXNeddedObjectY를 만드는 것을 도울 것입니다. 그러나 내가 틀리지 않다면 똑같은 문제입니다. 모든 컨테이너에 컨테이너를 제공해서는 안되며 단순히 컨테이너로 생성 된 객체를 전달해야합니다. 그래서 내 모든 객체 ObjectXNeddedObjectY (내 컨테이너에서 생성)를 내 공장으로 전달해야합니까? –

+0

DIC는 인스턴스화 될 클래스와 관련된 객체의 컬렉션을 반환해야하며, 팩토리는 리플렉션을 사용하여 'http://www.php.net/manual/'과 같은 호출을 사용하여 컬렉션과 함께 클래스를 인스턴스화 할 수 있습니다 en/reflectionclass.newinstanceargs.php' –

답변

0

클래스 Factory 생성자 변경하는 경우, 당신은 클래스 Factory에도 다시 갈 필요가 있기 때문에, 클래스 ObjectBNeededObject1에서 개체를 실체화하는 방법을 알고 안하고 할 필요한 작업이 업데이트] 회귀를

피하기 위해

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. 그러나 공장의 클라이언트는 원하는 객체를 만들기 위해 어떤 객체가 필요한지를 알아야한다는 점을 좋아하지 않습니다. 예를 들어, 클라이언트가 여러 종류의 "워크 플로 단계"로 작업해야하는 클래스 워크 플로 인 경우 이러한 단계 중 하나에 HttpRequest 개체가 필요한 경우 내 워크 플로 개체에 단계를 생성 할 수있는 팩터 리와 HttpRequest. –

+0

당신이 제안하는 것은 아무 의미가 없으며 공장의 목적을 이기지 못합니다 ... "왜냐하면 만약 생성자가 바뀌면 당신도 다시 ...로 돌아갈 것입니다."당신이 그것에 대해 생각한다면 그것은 실제로 클라이언트는 구체적인 클래스를 직접 인스턴스화합니다. – plalx