팩토리 패턴 유행은 "새로운"키워드의 사용이 나쁘고 모든 비용을 피하거나 피해야한다는 "C 스타일"언어 (C / C ++, C #, Java)의 코더들 사이의 거의 독단적 인 믿음에서 비롯됩니다 중앙 집중식). 이는 단일 책임 원칙 (SOLID의 "S")과 종속성 반전 원칙 ( "D")에 대한 매우 엄격한 해석에서 비롯됩니다. 간단히 말해서, SRP는 코드 객체에는 "변경 사유"가 하나만 있어야하며 하나만 있어야합니다. "변경 이유"는 해당 객체의 중심적인 목적, 코드베이스에서의 "책임"및 코드 변경이 필요한 다른 것들은 해당 클래스 파일을 열지 않아도됩니다. DIP는 훨씬 더 단순합니다. 코드 객체는 다른 구체적인 객체에 의존해서는 안됩니다.
예를 들어, "new"및 public 생성자를 사용하여 호출 코드를 특정 구체적 클래스의 특정 생성 방법에 연결합니다. 이제 코드에서 MyFooObject 클래스가 존재하고 문자열과 int를 취하는 생성자가 있음을 알아야합니다. 생성자가 더 많은 정보를 필요로하는 경우, 현재 작성중인 정보를 포함하여 해당 정보를 전달하도록 생성자의 모든 사용법을 업데이트해야하므로 전달할 수있는 무언가가 있어야합니다. 그것을 얻기 위해 변경되거나 소비됩니다 (소비 객체에 더 많은 책임 추가). 또한 MyFooObject가 코드베이스에서 BetterFooObject로 바뀐 경우 이전 클래스 대신 새 오브젝트를 생성하도록 이전 클래스의 모든 사용법을 변경해야합니다.
따라서, MyFooObject의 모든 소비자는 MyFooObject를 포함한 클래스 구현 동작을 정의하는 "IFooObject"에 직접 의존해야합니다. 이제 IFooObjects 소비자는 IFooObject를 구성 할 수 없으며 (특정 구체적인 클래스가 필요하지 않은 IFooObject라는 지식이 없어도) IFooObject 구현 클래스 또는 메서드의 인스턴스를 제공 받아야합니다. 환경에서 올바른 IFooObject를 작성하는 방법을 아는 책임이있는 다른 오브젝트에 의해 외부에서, 일반적으로 팩토리라고합니다.
여기 이론이 현실과 만나는 곳이 있습니다. 항상 모든 유형의 변경에 개체를 닫을 수는 없습니다 . 예를 들어, IFooObject는 이제 코드베이스의 추가 코드 개체로, 소비자 또는 IFooObjects 구현에 필요한 인터페이스가 변경 될 때마다 변경되어야합니다. 이는이 추상화에서 객체가 서로 상호 작용하는 방식을 변경하는 것과 관련된 새로운 수준의 복잡성을 소개합니다. 또한 인터페이스 자체가 새로운 인터페이스로 교체되는 경우 소비자는 여전히 더 심층적으로 변화해야합니다.
좋은 코더는 설계를 분석하고 특정 방식으로 변경해야 할 장소를 찾아서 더 견딜 수 있도록 리팩토링하여 YAGNI ( "You Ai n't Gonna Need It")와 SOLID의 균형을 맞추는 방법을 알고 있습니다. 변화의 유형, 그 경우에 때문에 "당신이 있는 거 필요".