일부 상황에서 공장은 우아한 애플리케이션 설계를 가능하게하는 많은 장점이 있습니다. 하나는 팩토리를 만들어 나중에 생성하려는 객체의 속성을 한 곳에서 설정 한 다음 해당 팩토리를 넘길 수 있다는 것입니다. 그러나 종종 실제로 그렇게 할 필요는 없습니다. 이 경우 팩토리를 사용하면 실제로 대가로 아무것도주지 않고 복잡성을 추가합니다. 이 공장을 예로 들어 보겠습니다.
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
팩토리 패턴의 대안 중 하나는 매우 유사한 빌더 패턴입니다. 가장 큰 차이점은 팩토리가 생성 될 때 팩토리가 생성 한 객체의 속성이 설정되는 반면 빌더는 기본 상태로 초기화되고 모든 속성이 나중에 설정된다는 것입니다.
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
그러나 오버 엔지니어링이 문제인 경우 팩토리를 빌더로 교체해도 크게 개선되지는 않습니다.
두 패턴 중 가장 간단한 대체는 물론 new
연산자를 사용하여 간단한 생성자로 객체 인스턴스를 만드는 것 입니다.
Widget widget = new ColoredWidget(COLOR_RED);
그러나 생성자는 대부분의 객체 지향 언어에서 결정적인 단점이 있습니다. 해당 클래스의 객체를 반환해야하며 하위 유형을 반환 할 수 없습니다.
런타임에 하위 유형을 선택해야하지만 완전히 새로운 빌더 또는 팩토리 클래스를 작성하지 않으려는 경우 팩토리 메소드를 대신 사용할 수 있습니다. 이것은 해당 클래스 또는 하위 클래스 중 하나의 새 인스턴스를 반환하는 클래스의 정적 메서드입니다. 내부 상태를 유지하지 않는 팩토리는 종종 다음과 같은 팩토리 방법으로 교체 할 수 있습니다.
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Java 8의 새로운 기능 은 상태 비 저장 팩토리에서와 마찬가지로 메소드를 전달할 수 있는 메소드 참조 입니다. 편리하게도 메소드 참조를 받아들이는 것은 동일한 기능 인터페이스를 구현하는 모든 객체를 허용하며, 내부 상태를 가진 본격적인 팩토리 일 수도 있으므로 나중에 이유를 알면 팩토리를 쉽게 소개 할 수 있습니다.