[design-patterns] 빌더 디자인 패턴과 팩토리 디자인 패턴의 차이점은 무엇입니까?

빌더 디자인 패턴과 팩토리 디자인 패턴의 차이점은 무엇입니까?

어느 것이 더 유리하고 왜 그럴까요?

이러한 패턴을 테스트하고 비교 / 대비하려면 결과를 그래프로 어떻게 표현합니까?



답변

디자인 패턴을 사용하면 일반적으로 모든 경우에 적합한 “더 유리한”솔루션이 없습니다. 구현해야 할 내용에 따라 다릅니다.

Wikipedia에서 :

  • Builder는 복잡한 객체를 단계별로 구성하는 데 중점을 둡니다. Abstract Factory는 제품군의 제품군 (간단하거나 복잡한)을 강조합니다. Builder는 제품을 최종 단계로 반환하지만 Abstract Factory에 관한 한 제품은 즉시 반환됩니다.
  • 빌더는 종종 컴포지트를 빌드합니다.
  • 종종 디자인은 Factory Method (더 복잡하지 않고 사용자 정의가 가능하며 서브 클래스가 확산 됨)를 사용하여 시작하여 설계자가 더 많은 유연성이 필요한 곳을 발견함에 따라 Abstract Factory, Prototype 또는 Builder (보다 유연하고 더 복잡한)로 발전합니다.
  • 때로는 생성 패턴이 보완적일 수 있습니다. Builder는 다른 패턴 중 하나를 사용하여 구성 요소를 작성할 수 있습니다. Abstract Factory, Builder 및 Prototype은 구현에서 Singleton을 사용할 수 있습니다.

팩토리 디자인 패턴에 대한 Wikipedia 항목 :
http://en.wikipedia.org/wiki/Factory_method_pattern

빌더 디자인 패턴에 대한 Wikipedia 항목 :
http://en.wikipedia.org/wiki/Builder_pattern


답변

팩토리 는 단순히 생성자 주위의 래퍼 함수입니다 (아마도 다른 클래스에있는 것). 가장 큰 차이점은 팩토리 메소드 패턴은 전체 매개 변수가 단일 행으로 전달 된 전체 메소드를 단일 메소드 호출로 빌드해야한다는 것입니다. 최종 객체가 반환됩니다.

반면에 빌더 패턴 은 본질적으로 생성자 호출에 전달할 수있는 모든 가능한 매개 변수 주위의 랩퍼 오브젝트입니다. 이를 통해 setter 메소드를 사용하여 매개 변수 목록을 천천히 작성할 수 있습니다. 빌더 클래스의 추가 메소드 중 하나는 build () 메소드입니다. 이는 단순히 빌더 오브젝트를 원하는 생성자로 전달하고 결과를 리턴합니다.

Java와 같은 정적 언어에서는 가능한 모든 매개 변수 조합에 대해 텔레스코픽 생성자를 가질 필요가 없으므로 소수의 (잠재적으로 선택적인) 매개 변수가있는 경우 더 중요합니다. 또한 빌더를 사용하면 생성자 호출 후 직접 수정할 수없는 읽기 전용 또는 개인 필드를 정의하기 위해 setter 메소드를 사용할 수 있습니다.

기본 공장 예

// Factory
static class FruitFactory {
    static Fruit create(name, color, firmness) {
        // Additional logic
        return new Fruit(name, color, firmness);
    }
}

// Usage
Fruit fruit = FruitFactory.create("apple", "red", "crunchy");

기본 빌더 예

// Builder
class FruitBuilder {
    String name, color, firmness;
    FruitBuilder setName(name)         { this.name     = name;     return this; }
    FruitBuilder setColor(color)       { this.color    = color;    return this; }
    FruitBuilder setFirmness(firmness) { this.firmness = firmness; return this; }
    Fruit build() {
        return new Fruit(this); // Pass in the builder
    }
}

// Usage
Fruit fruit = new FruitBuilder()
        .setName("apple")
        .setColor("red")
        .setFirmness("crunchy")
        .build();

이 두 위키 백과 페이지의 코드 샘플을 비교해 볼 가치가 있습니다.

http://en.wikipedia.org/wiki/Factory_method_pattern
http://en.wikipedia.org/wiki/Builder_pattern


답변

팩토리 패턴은 대부분 빌더 패턴의 단순화 된 버전으로 볼 수 있습니다.

에서 공장 패턴, 공장은 필요에 따라 개체의 다양한 아형을 만드는 담당하고있다.

팩토리 메소드의 사용자는 해당 오브젝트의 정확한 서브 타입을 알 필요가 없습니다. 팩토리 메소드의 예는 또는 유형이 지정된 오브젝트를 createCar리턴 할 수 있습니다 .FordHonda

에서 빌더 패턴, 다른 아형은 작성기 방법으로 만들지 만, 물체의 조성물은 같은 서브 클래스 내에서 다를 수있다.

자동차 예제를 계속하려면 4 개의 실린더 엔진 createCar으로 Honda유형이 지정된 오브젝트 를 작성 하거나 Honda6 개의 실린더 로 유형 이 지정된 오브젝트 를 작성 하는 빌더 메소드 가있을 수 있습니다 . 빌더 패턴은이 세밀한 세분성을 허용합니다.

빌더 패턴팩토리 메소드 패턴 모두의 다이어그램은 Wikipedia에서 사용 가능합니다.


답변

빌더 디자인 패턴은 여러 단계에 걸쳐 특정 유형의 다른 오브젝트를 작성하는 방법을 알고있는 오브젝트를 설명합니다. 각 중간 단계에서 대상 항목에 필요한 상태를 유지합니다. StringBuilder가 최종 문자열을 생성하기 위해 어떤 과정을 거쳐야하는지 생각해보십시오.

팩토리 디자인 패턴은 특정 매개 변수를 기반으로 특정 유형이 선택되는 한 단계에서 여러 가지 관련이있는 여러 종류의 오브젝트를 작성하는 방법을 알고있는 오브젝트를 설명합니다. 직렬화 시스템을 작성하고 직렬화기를 작성하면 한 번의 호출로 원하는 오브젝트를 구성 할 수 있습니다.


답변

  • 단계별로 복잡한 객체 생성 : 빌더 패턴

  • 단일 메소드를 사용하여 간단한 오브젝트를 작성합니다. 팩토리 메소드 패턴

  • 여러 팩토리 메소드를 사용하여 오브젝트 작성 : 추상 팩토리 패턴


답변

빌더 패턴과 팩토리 패턴은 둘 다 개체를 생성하기 때문에 육안과 매우 유사 해 보입니다.

근데 좀 더 가까이 봐야 해

이 실제 예제는 둘 사이의 차이점을 더 명확하게 만듭니다.

가정 당신은 패스트 푸드 레스토랑에 가서 당신이 주문한 음식을 .

1) 무슨 음식?

피자

2) 토핑은 무엇입니까?

고추, 토마토, 바베 큐 치킨, 아니 파인애플

따라서 다양한 종류의 음식은 팩토리 패턴으로 만들어 지지만 특정 음식의 다른 변형 (맛)은 빌더 패턴으로 만들어집니다.

다른 종류의 음식

피자, 버거, 파스타

피자의 변종

치즈, 치즈 + 토마토 + 고추, 치즈 + 토마토 등

코드 샘플

여기서 두 패턴의 샘플 코드 구현을 볼 수 있습니다.
Builder Pattern
Factory Pattern


답변

둘 다 객체를 만들기위한 창조 패턴입니다.

1) 팩토리 패턴-하나의 수퍼 클래스와 N 개의 서브 클래스가 있다고 가정하십시오. 전달되는 매개 변수 / 값에 따라 오브젝트가 작성됩니다.

2) 빌더 패턴-복잡한 오브젝트를 작성합니다.

Ex: Make a Loan Object. Loan could be house loan, car loan ,
    education loan ..etc. Each loan will have different interest rate, amount ,
    duration ...etc. Finally a complex object created through step by step process.