현재 추상 팩토리를 사용하여 요청 객체를 생성하기위한 사용자 정의 클래스 이름을 지정할 수 있습니다. 이렇게하는 이유는 코드를 변경하지 않고 핵심 기능을 쉽게 확장 할 수있게하려는 것입니다. 하지만 최근에이 접근법의 효용성에 관해서 몇 가지 의문점이있었습니다. PHP의 추상 팩토리 패턴으로 사용자 정의 클래스 인스턴스화 허용
는 공장 가 예상되는 인터페이스는 공장 개념의 bastardization 일치하는지 어떤 제출 된 클래스 이름을 인스턴스화 할 수 있습니다 : 그래서 제 질문은 이것이다? 나는 이것을 피하는 것이 더 나은가?
UPDATE 여기 논리가
이 : 한편으로, (예를 들어)는 실제 자동차 공장은 자동차를 만들 수 없습니다 그것은 기계가 장착되어 있지 않은 경우는 만들려면 그 종류의 차. 다른 한편으로는, 아래의 코드는 같은 자동차 공장에 청사진을 제공하여 원래 의도하지 않은 맞춤형 자동차를 만드는 것과 같습니다.
대안으로는 공장에서 사용할 수있는 사용자 정의 클래스 이름을 지정하는 구성 객체를 전달하고 구성 지정 사용자 정의 클래스 이름과 일치하는 경우 사용자 지정 클래스 만 만 생성하도록 팩토리를 제한 할 수 있습니다. 이견있는 사람?
그리고 관련 코드
...<?php
interface AbstractRequestFactory
{
public function buildRequest($type);
}
class RequestFactory implements AbstractRequestFactory
{
public function buildRequest($type='http')
{
if ($type == 'http') {
return new HttpRequest();
} elseif ($type == 'cli') {
return new CliRequest();
} elseif ($custom = $this->makeCustom($type)){
return $custom;
} else {
throw new Exception("Invalid request type: $type");
}
}
protected function makeCustom($type)
{
if (class_exists($type, FALSE)) {
$custom = new $type;
return $custom instanceof RequestInterface ? $custom : FALSE;
} else {
return FALSE;
}
}
}
// so using the factory to create a custom request would look like this:
class SpecialRequest implements RequestInterface {}
$factory = new RequestFactory();
$request = $factory->buildRequest('\SpecialRequest');
$ 유형 코드 스 니펫을 게시 할 수 있습니까? –
@MikePurcell 귀하의 요청에 따라 코드의 하단을 업데이트했습니다. – rdlowrey
"CLI", "Http"공장이 인터페이스 팩토리를 구현하기 위해 인터페이스 팩토리와 다양한 유형을 모두 줄이려고했습니다. –