빌더 : 동일한 시공 프로세스가 다른 표현을 생성 할 수 있도록 복잡한 물체의 구성을 표현에서 구분하십시오.
시나리오 사용 :
일반 클래스 다이어그램 :
예를 들어, 우리 삶의 많은 장치는 데스크탑 컴퓨터와 같은 조립 형태로 존재합니다. 일부 제조업체는 기본 구성으로 조립 된 컴퓨터 호스트를 시작합니다 (여기에서 템플릿 메소드 모드를 사용할 수 있음). 고객은 기본 구성이있는 제품을 구매하거나 제조업체에게 다양한 구성 및 어셈블리 방법으로 호스트를 다시 조립하도록 요청할 수 있습니다. 이 시점에서 빌더 모델을 사용하여 특별 고객의 요구 사항을 충족 할 수 있습니다.
이 예에서 제조업체는 호스트, 즉 호스트의 각 구성 요소에 초점을 맞추고 있으며 위의 빌더 모드가 제공하는 사용 시나리오와 일치합니다.
간단한 코드 구현은 다음과 같습니다.
// 추상 제품 클래스, 템플릿 메소드 모드를 사용하여 다른 제품은 다른 "구성 요소 부분"추상 클래스 AbstractProduct {보호 된 초록 void part01 (); 보호 된 초록 void part02 (); 보호 된 초록 void part03 (); // 템플릿 메소드는 기본 어셈블리 메소드를 제공하여 기본 제품 공개 최종 최종 추상 프로듀서 DefaultProduct () {part01 (); Part02 (); Part03 (); 이를 반환합니다. // 현재 객체를 반환합니다. 즉, 기본 어셈블리 메소드} // 특정 제품 A와 B가있는 제품은 다른 제품을 구현합니다. 다른 "구성 요소 부분"클래스 ConcretEproducta는 AbstractProduct를 확장합니다 {Protected Void Part01 () {System.out.out.println ( "Product A : Part01 () ..."); } Protected Void Part02 () {System.out.println ( "제품 A : Part02 () ..."); } Protected Void Part03 () {System.out.println ( "제품 A : Part03 () ..."); }} class concreteproductb 확장 actractProduct {protected void part01 () {system.out.println ( "제품 b : part01 () ..."); } Protected Void Part02 () {System.out.println ( "제품 B : Part02 () ..."); } Protected Void Part03 () {System.out.println ( "제품 B : Part03 () ..."); }} // Abstract Builder, BuildProduct ()를 생성하기위한 BuildPart () 및 표준을 구현 해야하는 조합 방법을 공식화합니다. 공개 초록 초록 제품 BuildProduct (); } / * * 특정 빌더가 기본 제품에 만족하지 않는 경우 (즉, 추상 제품의 DefaultProduct () 메소드가 호출 될 때) * 제품을 얻기 위해 호출 할 수는 없지만 특정 빌더를 사용하여 제품의 생산 및 조립 방법을 변경하여 다른 제품을 얻으려면 * / Class AbstractBuilder {privatebuilder extends Producta = 새로운 콘크리트 제품 (Condreeprocta); public void buildPart () {this.producta.part03 (); this.produta.part02 (); this.produta.part01 (); } public AbstractProduct BuildProduct () {return this.produate; }} Class ConcreteBuilderB 확장 AbstractBuilder {Private Abstractuct ProductB = New ConcreteProductb (); public void buildPart () {this.productb.part02 (); this.productb.part01 (); // 제품 B의 하나의 구성 요소는 생략됩니다. 예를 들어이 부분의 기능은 고객이 필요하지 않습니다. // this.productb.part03 (); } public AbstractProduct BuildProduct () {return this.productb; }} // 각 제품을 사전에 사전 보충하는 빌더 인 Director Class는 기본 제품 클래스 디렉터와 다른 제품이 필요한 사용자에게 다양한 어셈블리 방법을 제공합니다. Private AbstractBuilder buildb = New ConcreteBuilderB (); public AbstractProduct getProducta () {this.buildera.buildpart (); 이 is.buildera.buildProduct (); } public AbstractProduct getProductb () {this.builderb.buildpart (); 이 is.builderb.buildProduct (); }} // 테스트 클래스 공개 클래스 클라이언트 {public static void main (string [] args) {System.out.println ( "기본 제품을 얻기 위해 템플릿 메소드 모드를 사용하여"); AbstractProduct DefaultProduta = New ConcretEproduta (). DefaultProduct (); System.out.println ( "/nuse director 클래스가 다른 조립 방법을 갖는 제품 A를 얻기위한 클래스"); 이사 이사 = 새로운 이사 (); Director.getProducta (); System.out.println ( "/Nuse Director 클래스가 다른 조립 방법을 갖는 제품 B"); Director.getProductb (); }} 테스트 결과 :
템플릿 메소드 모드를 사용하여 기본 제품을 얻습니다
제품 A : Part01 () ...
제품 A : Part02 () ...
제품 A : Part03 () ...
디렉터 클래스를 사용하여 다른 조립 방법을 가진 제품을 얻습니다.
제품 A : Part03 () ...
제품 A : Part02 () ...
제품 A : Part01 () ...
Director 클래스를 사용하여 다른 조립 방법이있는 제품 B를 얻습니다.
제품 B : Part02 () ...
제품 B : Part01 () ...
실제로이 예에서 제품 범주는 이전 기사에서 언급 한 템플릿 메소드 모드, 즉 DefaultProduct ()가 제품의 기본 구성 요소를 조립하는 메소드를 제공합니다.
하지만 여기에 질문이 있습니다. 템플릿 메소드 패턴을 기반으로 AbstractProduct 클래스에 제공되는 소위 기본 어셈블리 방법은 몇 가지 테스트 문장을 인쇄하는 것이며 실제로 특정 제품을 반환하지는 않습니다. 그러나 위의 예에서 현재 객체를 반환하는 처리 방법이 합리적인지 여부는 모르겠습니다.
또한 Java 코드로 디자인 패턴 구현에 대한 기사를 작성한 후이 빌더 빌더 패턴이 추상 공장 패턴과 템플릿 메소드 패턴을 결합한 것으로 보입니다. 위의 단락은 이미 내 의심을 언급했습니다. 추상 공장 모델의 경우, 위의 코드 예제의 감독 클래스는 추상 공장의 특정 공장 클래스와 매우 유사하지만 Director Class는 제품을 반환하기 전에 제품 어셈블리 방법을 구축해야한다고 생각합니다. 아마도이 "빌드"는 빌더 모델이 제품의 다양한 부분의 어셈블리에 초점을 맞추는 반면, 추상 공장 모델은 최종 제품의 생성에만 초점을 맞추고 있습니다.
나는 이전에 문장을 읽었고 대략적으로 말한다. 컴퓨터 문제를 해결하기 어려운 경우 중간 층을 추가하여 처리 할 수있다. 이제 그것에 대해 생각하기 때문에 추상 공장과 건축업자 모드는이 "원칙"을 사용하여 원하는 효과를 달성하는 것으로 보입니다. 예를 들어, 추상 공장에는 추상 공장 수업이 있으며 Builder에는 감독 수업이 있습니다. 최종 분석에서는 특정 세부 사항을 캡슐화하고 숨기고 구현 및 사용에서 해체하는 것입니다.
더 잘 파악하기 전에 각 모델의 우려와 적용 가능한 시나리오를 먼저 이해해야한다고 생각합니다.
어쩌면 이러한 모드는 모두 창의적인 모드이며 실용적인 경험이 없어서 이것에 대해 약간 혼란스러워합니다 ... 두려워하지 않습니다. 나는 두려워하지 않습니다.
위의 내용은이 기사에 관한 모든 것이며, 그것이 당신이 배우도록 영감을주기를 바랍니다.