“StringBuilder”는 Builder Design Pattern의 응용 프로그램입니까?


31

"빌더"패턴은 "텔레 스코핑 생성자"반 패턴을 다루는 것으로 제한됩니까, 아니면 불변 개체의 복잡한 생성에 대한보다 일반적인 문제를 해결한다고 할 수 있습니까?

StringBuilder클래스에는 이름에 "builder"라는 단어가 있지만 텔레 스코핑 생성자와는 아무런 관련이 없으며 변경 불가능한 객체의 생성자에 전달하는 데 필요한 모든 데이터를 수집하는 데 도움이됩니다.

나에게 그것은 대답이 매우 "예"인 것처럼 보이지만 주제에 대해 약간의 의견 차이가있는 것처럼 보이므로 누군가가 그것을 분명히 할 수 있기를 바랍니다.

나는이 질문에 대답했다 : 프로그래머 SE : 생성자에서 합법적 인 "실제 작업"? OP가 복잡한 트리를 포함하는 (아마도 불변의) 객체를 만들고 싶고 "빌더"패턴에 대한 아이디어가 나타 났으며, 그것을 조사하는 동안 "StringBuilder"스타일의 객체 생성이라고하는이 Q & A가 발견되었습니다. 하지 : 그다지 명확하지 않은 이유에 대해 "빌더"패턴의 응용 프로그램 의 StringBuilder 및 빌더 패턴 - 유래 . (그 질문에 대답하는 사람들은 내가 말할 수있는 한 설득력있는 주장을하지 못했습니다.)


2
스택 오버플로 질문에 대한 Paul Sasik의 대답은 완전히 설득력이 있습니다. StringBuilder는 불변 문자열을 연결하는 성능 문제에 대한 "해결 방법"입니다. 기껏해야 StringBuilder는 "불행히 명명되었습니다." StringBuilder가 웹 페이지를 "빌드"할 수 있다는 주장을 할 수는 있지만 일반적인 메커니즘특정 응용 프로그램 이라고 생각 합니다.
Robert Harvey

3
Paul Sasik의 대답은 Java에 잘못되었습니다. 기본 소스 코드를 살펴 보았습니다. StringBuilder기본 문자 배열을 사용하여 문자열을 나타내며 언제든지 삽입 및 제거와 같은 작업을 수행 할 수 있습니다. 궁극적으로 StringBuilder는 불변의 String 객체에 대한 해결 방법이라고 생각하지만 그렇지 않으면 Builder 패턴의 의도를 충족시키는 것처럼 보입니다.
Thomas Owens

4
나는 이것에 대해 더 많이 생각할 필요가 있습니다-그것은 나를 귀찮게합니다. StringBuilder와 같은 것이 Builder 패턴의 버전이고 다른 모든 사람들이 왜 틀린지 거의 쓰기 시작했습니다. 그러나 나는 몇 가지 약점을 발견하고 내가 틀렸다고 확신했지만 첫 생각으로 돌아갈 수있었습니다. 빌더 패턴의 의도 만 살펴보면 "StringBuilder는 빌더"라는 것을 쉽게 알 수 있습니다. 빌더 패턴의 구조를 보면 더 어렵습니다.
토마스 오웬스

1
가치있는 것에 대해, Stack Overflow에 대한이 답변은 StringBuilder가 빌더 구현 이며 의견이 흥미 롭다 는 나의 초기 생각에 동의합니다 . 그래서 당신은 논쟁의 양쪽을 찾을 수 있습니다. 나는이 질문을 좋아한다-나는 좋은 답을 구할 수 있는지는 모르겠지만 흥미로운 질문이다. 나는 이것에 대해 생각할 것이다.
Thomas Owens

2
모든 GoF 패턴이 시간의 시험을 견디는 것은 아닙니다. 나는 아니에요 '선생님 , 난 그냥 선생님이있어'.
Ben

답변:


36

A StringBuilder는 빌더 패턴과 유사하지만이 디자인 패턴의 GoF 설명과 많이 공유되지 않습니다. 디자인 패턴의 원래 요점은

동일한 구성 프로세스가 다른 표현을 생성 할 수 있도록 복잡한 객체의 구성을 표현과 분리하십시오.

Design Patterns , Gamma, Helm, Johnson, Vlissides.

(참고 : "복잡한"은 주로 "복잡한"또는 "어려운"일 필요는 없지만 "여러 부분으로 구성됨"을 의미합니다)

"다른 표현"이 핵심입니다. 예를 들어이 시공 프로세스를 가정하면 :

interface ArticleBuilder {
  void addTitle(String title);
  void addParagraph(String paragraph);
}

void createArticle(ArticeBuilder articleBuilder) {
  articleBuilder.addTitle("Is String Builder an application of ...");
  articleBuilder.addParagraph("Is the Builder Pattern restricted...");
  articleBuilder.addParagraph("The StringBuilder class ...");
}

우리는 HtmlDocument또는TexDocumentMarkdownDocument제공되는 구체적인 구현에 따라 또는 a로 .

class HtmlDocumentBuilder implements ArticleBuilder {
  ...
  HtmlDocument getResult();
}

HtmlDocumentBuilder b = new HtmlDocumentBuilder();
createArticle(b);
HtmlDocument dom = b.getResult();

따라서 빌더 패턴의 중심점 중 하나는 다형성 입니다. 디자인 패턴 책은이 패턴을 추상 팩토리와 비교합니다.

Abstract Factory는 복잡한 객체를 생성 할 수 있다는 점에서 Builder와 유사합니다. 주요 차이점은 빌더 패턴이 복잡한 오브젝트를 단계별로 구성하는 데 집중한다는 것입니다. […] Builder는 제품을 최종 단계로 반환하지만 Abstract Factory에 관한 한 제품은 즉시 반환됩니다.

Design Patterns , Gamma, Helm, Johnson, Vlissides.

이 단계별 측면은 빌더 패턴의 대중적인 측면이되었으므로 공통 관점에서 빌더 패턴은 다음과 같이 이해됩니다.

객체의 구성을 여러 단계로 나눕니다. 이를 통해 이러한 기능을 지원하지 않는 언어에서도 명명 된 인수 또는 선택적 매개 변수를 사용할 수 있습니다.

Wikipedia는 다음과 같은 패턴을 정의합니다.

빌더 패턴은 오브젝트 작성 소프트웨어 디자인 패턴입니다. 다형성을 가능하게하려는 추상 팩토리 패턴 및 팩토리 메소드 패턴과 달리 빌더 패턴의 의도는 텔레 스코핑 생성자 안티 패턴에 대한 솔루션을 찾는 것입니다 . . […]

빌더 패턴에는 또 다른 이점이 있습니다. 플랫 데이터 (html 코드, SQL 쿼리, X.509 인증서 ...)를 포함하는 개체, 즉 쉽게 편집 할 수없는 데이터에 사용할 수 있습니다. 이 유형의 데이터는 단계별로 편집 할 수 없으며 한 번에 편집해야합니다. 이러한 오브젝트를 구성하는 가장 좋은 방법은 빌더 클래스를 사용하는 것입니다. [인용 필요]

Wikipedia의 Builder Pattern 에서 다양한 기고자에 의해 작성 되었습니다.

우리가 볼 수 있듯이,이 이름이 어떤 패턴을 가리키는 지에 대한 진정한 공통의 이해가 없으며, 어떤 점에서는 다른 정의가 서로 모순되기도합니다 (예 : 빌더의 다형성의 관련성에 관한).

StringBuilder패턴을 다양하게 해석 할 수있는 유일한 공통 속성은 제품이 한 번에 하나씩이 아니라 단계별로 생성된다는 것입니다. 디자인 패턴에 대한 GoF 정의를 엄격하게 읽지는 않지만 디자인 패턴은 의사 ​​소통을 용이하게하는 가단성 개념입니다. 나는 StringBuilder비정형적인 것이지만 빌더 패턴의 예를 계속 부를 것 입니다. Java에서 그 구조의 주된 이유는 불변 문자열이 존재할 때 성능을 연결하지만 흥미로운 객체 지향 디자인은 아닙니다.


7
불변의 객체를 만드는 것이 빌더의 일반적인 용도 중 하나 인 것 같습니다. GoF에서 설명한대로 기본 용도를 대체 한 것 같습니다. 따라서 이것이 패턴의 인스턴스로 가장 잘 설명된다는 데 동의합니다.
Jules

불변의 그래프를 만드는 데 동의하는 Builder DSL의 또 다른 사용 사례는 단위 + 통합 테스트 중에 Fake data / ObjectMothers의 큰 그래프를 만드는 데 실제로 유용합니다.
StuartLC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.