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
또는TexDocument
MarkdownDocument
제공되는 구체적인 구현에 따라 또는 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에서 그 구조의 주된 이유는 불변 문자열이 존재할 때 성능을 연결하지만 흥미로운 객체 지향 디자인은 아닙니다.