자신에게 무엇이고 왜 그런지 물어보십시오. 둘 다 객체의 인스턴스를 만들기 위해 존재합니다.
ElementarySchool school = new ElementarySchool();
ElementarySchool school = SchoolFactory.Construct(); // new ElementarySchool() inside
지금까지 아무런 차이가 없습니다. 이제 다양한 학교 유형이 있으며 ElementarySchool을 HighSchool (ElementarySchool에서 파생되거나 ElementarySchool과 동일한 인터페이스 ISchool을 구현 함)로 전환하려고합니다. 코드 변경은 다음과 같습니다.
HighSchool school = new HighSchool();
HighSchool school = SchoolFactory.Construct(); // new HighSchool() inside
인터페이스의 경우 :
ISchool school = new HighSchool();
ISchool school = SchoolFactory.Construct(); // new HighSchool() inside
이제이 코드가 여러 곳에있는 경우 팩토리 메소드를 변경하면 완료되었으므로 팩토리 메소드를 사용하는 것이 상당히 저렴하다는 것을 알 수 있습니다 (두 번째 예제를 인터페이스와 함께 사용하는 경우).
이것이 주요 차이점과 장점입니다. 복잡한 클래스 계층을 다루기 시작하고 이러한 계층에서 클래스 인스턴스를 동적으로 만들려면 다음 코드를 얻습니다. 팩토리 메소드는 인스턴스화 할 구체적인 인스턴스를 메소드에 알려주는 매개 변수를 취할 수 있습니다. MyStudent 클래스가 있고 학생이 해당 학교의 구성원이되도록 해당 ISchool 개체를 인스턴스화해야한다고 가정 해 봅시다.
ISchool school = SchoolFactory.ConstructForStudent(myStudent);
이제 다른 IStudent 객체에 대해 인스턴스화 할 ISchool 객체를 결정하는 비즈니스 로직이 포함 된 앱의 한 곳이 있습니다.
따라서 간단한 클래스 (값 객체 등)의 경우 생성자는 훌륭하지만 (응용 프로그램을 너무 많이 엔지니어링하고 싶지는 않습니다) 복잡한 클래스 계층의 경우 팩토리 메소드가 선호되는 방법입니다.
이런 식으로 당신은 "구현이 아니라 인터페이스에 대한 프로그램"이라는 네 권의 책 에서 첫 번째 디자인 원칙을 따릅니다 .