2013-03-27 3 views
3

내 제목이 정확한지 확실하지 않은 경우 정확한 용어를 사용하고 있는지 확실하지 않습니다.의존성 주입 및/또는 공장 패턴

개체 인 속성을 가진 클래스가 있습니다. 이 속성을 설정할 때 객체가 만들어 져야합니다. 제 질문은 어떻게 단단한 커플 링없이 이것을 할 수 있습니까?

예 :

class A 
{ 
    protected $_depending; 

    protected $_somePropertyObject; 

    public function __construct(\Lib\Dependency $depending) 
    { 
     $this->_setDepending($depending); 
    } 

    protected function _setDepending(\Lib\Dependency $depending) 
    { 
     $this->_depending = $depending; 
    } 

    public function setSomeProperty($someProperty) 
    { 
     // I want to prevent this 
     $this->_somePropertyObject = new \Lib\some\Object($someProperty); 
    } 
} 

난 그냥 구조물을 통해 필요한 개체를 전달할 수 있지만, 더 무엇을 필요됩니까?

팩토리 패턴을 올바르게 이해할 경우이 변경 사항은 무엇입니까? 어딘가에서 객체를 생성해야합니다. 객체 자체가 아니라 공장. 다시 단단히 묶어 라? 내게 끝이없는 것 같아. 다시 말해 클래스를 팩토리링 할 때 클래스가 생성 된 곳과 방법이 분리됩니다.

setSomeProperty 함수를 \ Lib \ some \ Object 만 받아들이도록 설정하면 부모 개체가이 개체를 전달하기 위해 계속 전달해야합니다. 생성 된 위치의 배치 만 이동하는 것처럼 보입니까?

바라기를 나는 묻고 자하는 것이 무엇인지 잘 알고 있기를 바랍니다.

미리 감사드립니다.

편집 내가 묻는 것은 언제, 어디서, 왜 만들어지는 순서입니다.

답변

4
의존성 주입 패턴에 공장의 목적은 그것을 생산하는 방법을 알 필요 다른 예를하지 않고, 또 다른 예를 들어 인스턴스를 생성하는 것입니다

.

"공장"은 객체 반환 자입니다. 호출 될 때 인스턴스를 반환하는 것입니다.

더 많은 언어로보기가 더 쉽습니다. 예를 들어 Python 클래스에서는 호출 가능 (new 연산자가 없음)하고 클래스를 호출하면 클래스의 인스턴스가 생성됩니다. 따라서 클래스가 인수를 필요로하지 않으면 클래스는 자체 공장이 될 수 있습니다. 마찬가지로 인스턴스를 리턴하는 인수가없는 함수는 팩토리로 간주 될 수 있습니다. 이렇게하면 의존성 삽입이 매우 명확하고 무료로 제공됩니다. (클래스 나 함수는 일류 PHP처럼 완전하지 않은 자바/C++/C#을 정적 형식의 전통, 또는) 더 엄격한 언어에서

, 당신은 "design patterns" are missing language features 때문에,에 "패턴"뒤에 의존성 주입을 모호하게 할 필요가있다. PHP 5.3+ 클로저를 팩토리로 사용하거나 Java/C# 방식으로 이동하여 FactoryInterface 및 팩토리마다 새로운 클래스를 정의 할 수 있습니다.

예를 들어, 클래스, 당신이 할 수 있습니다 :

$other_dep_factory = function(){ return new SomeOtherClass(); }; 
을 :

이 클래스에서
class Aprime extends A 
{ 
    public function setSomeProperty($somePropertyFactory) 
    { 
     $this->_somePropertyObject = $somePropertyFactory(); 
    } 
} 

setSomeProperty는이 같은 생산할 수있는 제로 인수 호출 "공장", 필요

또는이 같은 :

class ClassFactory { 
    function __construct($classname, $args=array()) { 
     $this->class = new ReflectionClass($classname); 
     $this->args = $args; 
    } 

    function __invoke() { 
     return $this->class->newInstanceArgs($this->args); 
    } 
} 

$other_dep_factory = new ClassFactory('SomeOtherClass'); 

PHP 5.3 이전에, 당신이해야 할 자바처럼 :

interface IObjectFactory { 
    function getObject(); 
} 

// this B-and-D interface is optional 
// it has no body because PHP doesn't support 
// type-hinting return values 
interface ISomeOtherClassFactory {} 


class SomeOtherClassFactory implements ISomeOtherClassFactory { 
    function getObject() { 
     return new SomeOtherClass(); 
    } 
} 

class Aprime extends A 
{ 
    public function setSomeProperty(ISomeOtherClassFactory $somePropertyFactory) 
    { 
     $this->_somePropertyObject = $somePropertyFactory->getObject(); 
    } 
} 


$other_dep_factory = new SomeOtherClassFactory(); 
$myAprimeObject->setSomeProperty($other_dep_factory); 

그래서 언제 팩토리를 사용합니까? 객체가 다른 객체를 생성해야 할 때마다. 객체가 에만 필요하면 다른 객체를 사용하고 인스턴스를 전달하면됩니다.

+0

하지만이 팩토리 객체는 어디서 만듭니 까? 의존성으로 전달해야합니까? 정적이없는 것이 바람직합니다. – John

+0

필요한 것을 만들기 전에 먼저 만듭니다. –

+0

그럼 여전히 단단히 결합 되었습니까? 예 : public function something() {$ factory = new factory(); }? 세터에 대해 말하지 않습니까? – John

0

$ _somePropertyObject에 저장된 객체를 만들기 위해 "정보"를 수집해야 할 때 팩토리 패턴을 사용하고 싶습니다. 예를 들어 인스턴스를 생성하기 위해 일부 속성에 값을 할당하거나 인스턴스를 생성 한 직후에 몇 가지 메소드를 실행해야한다고 가정 해 보겠습니다.

또한 나중에 상속 트리를 변경해야 할지를 고려해야합니다. $ _somePropertyObject a \ Lib \ some \ Object를 할당하면 나중에 \ Lib \ some \ FancyObject에 대해 쉽게 바꿀 수 있기를 바랍니다. 종속성 삽입을 사용하면 하위 유형을 쉽게 바꿀 수 있습니다. 도 또한 http://net.tutsplus.com/tutorials/php/the-whens-and-whys-for-php-design-patterns/

: 여기

는 프라이머의 https://stackoverflow.com/a/2083455/1121827

+0

공장에서는 어디에서 어떻게 만드나요? 정보를 작성, 정의 및 수집합니까? 그 첫 번째 클래스에서 호출됩니다. – John

+0

수정 사항을 확인하십시오. 나는 factory 객체 자체를 어디서 만들지 궁금하다. – John