팩토리에서 생성 된 일부 객체를 제대로 초기화하기 전에 초기화해야하는 우리 시스템 용 팩토리 클래스 세트를 설계하려고합니다.객체 초기화가있는 팩토리 클래스 - 정적을 피하려고 시도합니다.
예 : 예를 들어 동일한
$foobar = new Foobar();
$foobar->init($qux, ...);
// $foobar ready for usage
은 $qux
오브젝트 만 종속 그 Foobar
필요가 있음을 말하고 있습니다. 내가 도착하고 싶은 것은 :
$qux
개체를 따라 전달하고 다른 매개 변수로 팩토리 클래스에 전달해야 할 필요성을 방지하기 위해
$foobar = Foo_Factory('bar');
, 내가 수행하고 싶습니다 직접 공장 클래스의 Foobar
의 초기화 :
class Foo_Factory {
public static function getFoo($type) {
// some processing here
$foo_name = 'Foo' . $type;
$foo = new $foo_name();
$foo->init($qux);
return $foo;
}
}
이 마음에 와서 몇 가지 솔루션을하지만, 그들 중 누구도 이상적입니다 :
- 는 정적 세터 메타 추가 팩토리 클래스에
$qux
에 대한 od를 입력하고$qux
에 대한 참조를 개인 정적 변수에 저장하십시오. 시스템은 처음에$qux
을 설정할 수 있으며 팩토리 클래스는 보안상의 이유로 향후 변경을 막을 수 있습니다.
이 방법이 효과가 있지만$qux
에 대한 참조를 저장하기 위해 정적 매개 변수를 사용하는 것은 단위 테스트 중에 문제가됩니다 (예 : 정적 상태로 인해 개별 테스트간에 행복하게 살아남음). - 싱글 톤 패턴을 사용하여 새 컨텍스트 클래스를 만들고 팩토리 클래스에서이를 사용하여
$qux
에 대한 참조를 가져 오도록합니다. 이것은 옵션 # 1보다 (팩토리 클래스에서 컨텍스트 클래스로 정적 문제를 이동 시키더라도) 이것을 수행하는 좀 더 깔끔한 방법 일 수 있습니다. - 종속성 주입을 항상 사용합니다. 즉, 팩토리 클래스를 사용하는 모든 객체에
$qux
을 전달하고 다른 객체로 공장 클래스에 전달합니다 (Foo_Factory::getFoo($type, $qux);
). - 위와 같지만 (# 3) 시스템을 따라
$qux
을 전달하는 대신 factory 클래스의 인스턴스를 전달합니다 (이 경우 static이지만 인스턴스화 할 수 없음).
무엇을 권하고 싶니? 위에서 언급 한 네 가지 대안 중 하나를 선택하거나 더 나은 방법으로이 작업을 수행 할 수 있습니까?
참고 : 여기에 flamewar로 static is evil
에 들어가기를 원하지 않고 최상의 솔루션을 찾으려고합니다.
아, 사실은 매우 멋진 - 내가 더 상세하게 (실질적으로) 내가 기회를 얻을 때의 심포니에보고해야합니다 것을 알 수 있습니다. 간단한 컨테이너 솔루션을 만들었고, 여전히 내부적으로 공장을 사용하고 있지만, 매력처럼 작동합니다 .-- 피드백과 예제에 감사드립니다! – MicE