OOP 및 학습 패턴을 처음 접했기 때문에 Factory Method를 시험해 볼 간단한 코드를 작성 했으므로 다른 하위 유형을 추가하려는 경우를 제외하고는 모두 잘된 것처럼 보입니다. 다음 코드는 지금까지의 : 요구 사항이 나이> 70 일 때를위한 하위 클래스 Pensioner
을 포함 나중에 변경자바의 매개 변수화 된 팩토리 메소드를 확장합니다.
public interface Person {
public String getDescription();
}
public class Adult implements Person {
@Override
public String getDescription() {
return "I am an ADULT";
}
}
public class Child implements Person {
@Override
public String getDescription() {
return "I am a CHILD";
}
}
public class PersonFactory {
public Person create(int age) {
if (age < 18) return new Child();
return new Adult();
}
}
public class ClientA {
public static void main(String[] args) {
PersonFactory personFactory = new PersonFactory();
Person person;
person = personFactory.create(80);
System.out.println(person.getDescription());
}
}
경우 중 하나에 내가 가진 것 :
가 create()
에 선 if (age > 70) return new Pensioner();
추가 메서드는 반드시 Open-Closed 원칙을 어기는 PersonFactory
클래스에서? 또는 The Gang Of Four Design Patterns에서 제안한 것처럼 매개 변수화 된 팩토리 메서드를 재정의하여 작성자가 생성 한 제품을 선택적으로 확장합니다. 이 경우 그 새로운 클래스를 작성하는 의미 생각 :
public class PersonFactoryWithPensioner extends PersonFactory {
@Override
public Person create(int age) {
if (age > 70) return new Pensioner();
return super.create(age);
}
}
이 이제 PersonFactory
지금 것이다 전화를 모든 클라이언트 중 하나를 대신 PersonFactoryWithPensioner
를 사용하도록 변경 될 수 있음을 의미하거나 그 새를 받아 들여야 고객은 PersonFactoryWithPensioner
으로 전화를 걸 수 있습니다. ClientA
은 나이가> 70 일 때만 Adult
오브젝트를 수신합니다. 나중에 다른 서브 클래스 인 경우 나중에 더 심각해집니다. Infant
이 추가됩니다. 새 클라이언트가 Infant
, Child
, Adult
또는 Pensioner
의 개체를 수신하도록하려면 새 클래스 PersonFactoryWithInfant
을 PersonFactoryWithPensioner
까지 확장해야합니다. 이건 옳지 않아, 내가 GoF가 제안한 것을 오해 한 것 같다.
내 질문은 : 변경하지 않고 이전 클라이언트에 반환 할 수있는 새로운 하위 형식을 추가하고 PersonFactory
코드를 변경하여 OCP를 손상시키지 않고 새 하위 유형을 포함 할 수 있습니까?
사과를 올바르게 게시하지 않은 경우 여기에 질문을 게시 한 것은 처음입니다. 비슷한 문제에 대한 이전 답변을 살펴 보았지만 문제를 해결하지 못했습니다.
당신이 읽었습니까 : http://softwareengineering.stackexchange.com/questions/302780/does-the-factory-pattern-violate-the-open-closed-principle – jaudo
나는 닫힌 폐쇄 원리를 깨는 것이 길이라고 생각합니다. 현재의 구현은 자식 또는 어른 생성을 지원하고 if 문을 추가하여 메서드를 변경하는 것이 훨씬 쉽고 깨끗 해지고 팩토리를 확장하는 여러 클래스를 만드는 것을 지원하므로 갈 것입니다. –
이것은 팩토리 메서드 패턴이 아닙니다. 이 예는 일반적으로 단순 공장이라고합니다. GoF 패턴이 아닙니다. – jaco0646