2013-08-24 3 views
2

작성자 패턴에 대해 몇 가지 질문이 있습니다.
- Use builder pattern from the constructor in a subclass
은 - When would you use the builder pattern
- Java improving builder pattern on a specific class
- 좀 작은 세부 사항을 변경 2.작성자 패턴이 공용 생성자와 일치 함

어제 블로흐 항목에 descripted처럼 Builder design pattern why do we need a director

지금까지 내가 빌더 패턴을 사용했다. 나는 기본값을위한 public 생성자를 추가했다. 따라서 복잡한 객체에 대해 Builder를 사용하거나 필요한 값을 가진 단순 객체에 대해 생성자를 사용할 수 있습니다.

public class Blub { 
    private final String id; 
    public Blub(final String id) { 
    this(Blub.Builder(id)); 
    } 

    private Blub(Builder builder) { 
    this.id = builder.id; 
    } 

    public static class Builder { 
    private final String id; 
    public Builder(final String id) { 
     this.id = id; 
    } 

    public Blub build() { 
     return new Blub(this); 
    }  
    } 
} 

하지만 설계상의 결함이 있는지 확실하지 않습니다. 왜냐하면 내가 수업을 마무리하면 단점이 없다는 것이 확실하기 때문입니다. 쉬운 경우, Blub 생성자를 호출하는 것이 가능할 것입니다.

new Blub("1a"); 
대신

(new Blub.Builder("1a")).build(); 

하지만 클래스를 완료하지 않으면 그것을 확장하고 새로운 생성자에서 물건의 모든 종류의 일을 할 수있을 것입니다. 그리고 지금 이것을 망칠 사건이 없는지 확실하지 않습니다. 어떤 생각?

+0

누군가가 수업을 듣는다면, 올바르게하는 것이 그들의 임무입니다. 그들이 그렇게 잘못하면 어떻게 될지 걱정하지 않을 것입니다. 멍청한 놈은 고칠 수 없어. 그 문제에 관해서는 모든 클래스의 모든 메소드를 오버라이드 (override) 할 수있어, 정반대의 것을해야합니다. 그러니 걱정하지 마세요. –

+1

@GabeSechan 와우, 나는 더 이상 동의 할 수 없다. 클래스는 상속을 위해 설계되거나 금지되어야합니다. 소프트웨어에 미래의 버그를 만들고 있습니다. –

+0

@Christian 마지막으로 Blub을 만드는 데있어 어떤 문제가 있습니까? –

답변

0

내가 자주하는 한 가지는 공통된 간단한 경우를 빌드하는 정적 팩토리 메소드 및 빌더를 제공하는 것입니다. 이 방법을 사용하면 여전히 개인 생성자를 가질 수 있으며 기본 사례를 구성하는 명확한 방법을 보여줄 수 있습니다.

Blub blub = Blub.createWithId("id"); 

이 또한 혼란 매개 변수를 사용하여 여러 생성자 또는 생성자가 필요없이 여러 정적 팩토리 메소드를 추가 할 수 있습니다.

1

빌더 (또는 해당 팩트 패턴)를 사용하려는 경우 매개 변수화 된 생성자를 사용하는 것이 일반적으로 반 직관적입니다 (의존성이 아니고 IoC를 사용하는 경우 제외). 근본적으로 직교성과 건조 원칙을 깨고 있습니다. 빌더 및 팩토리 패턴은 일반적으로 인스턴스 작성이 중요하지 않거나 오류가 발생하기 쉬운 구성 문제를 해결하는 데 사용됩니다.

귀하의 경우에는 그렇지 않습니다.

디자인 결함입니까? 아니요. 잠재적으로 API가 혼란스럽게 될 수 있습니까? 전혀. 특히 시간이 지남에 따라 더 많은 코드가 발산하고 A와 B 중 하나를 사용하기 시작합니다. 새 개발자가 A 메소드를 사용하여 객체를 만들 때 또는 B 메소드를 사용해야 할 때 설명하겠습니까?

관련 문제