2009-05-03 4 views

답변

5

생각 여행 일정 작성 도구. 호텔에 추가 할 수있는 많은 것들이 있습니다. 호텔, 렌터카, 항공사 항공편 및 각 항공사의 카디널리티는 0 ~ *입니다. Alice는 자동차와 호텔을 소유하고있을 수 있고 Bob은 두 대의 항공편을 이용할 수 있으며 자동차와 호텔은 세 곳이 없을 수도 있습니다.

콘크리트 공장이나 추상 공장을 만들어 일정을 짜내는 것은 매우 어려울 것입니다. 필요한 것은 서로 다른 단계를 가질 수있는 공장, 특정 단계가 발생할 수있는 공장, 다른 공장에서는 생성 과정의 결과로 매우 다른 유형의 객체를 생성하지 않는 공장입니다.

일반적으로 프로세스를 통해 더 높은 그레인 제어가 필요한 경우에만 공장에서 시작하여 빌더로 이동해야합니다.

Data & Object Factory에도 좋은 설명, 코드 예제 및 UML이 있습니다.

+0

동의! 우리의 소프트웨어에서는 빌더 패턴을 구현하지만 기본 객체는 Factory 객체의 결과로 생성되며 필요한 객체를 추가합니다. 제 대답은 실세계의 코딩 예제에 가깝지만, 현실적인 관점에서 보았을 때 +1이었습니다. – jeremyalan

1

편집 : 내 의견에이 질문에 대답하기 위해 몰래 빠져 나와 혼란스러워 할 것입니다. 앞서 원래 생각한대로 Abstract Factory에서 작동하도록이 글을 편집하겠습니다.하지만 원래의 질문에 대한 응답 일 필요는 없습니다.

내가 본 가장 일반적인 예는 GUI 구성 요소를 작성하는 방법을 설명합니다.

예를 들어 GUI 구성 요소가 여러 표현 (어쩌면 어떤 플랫폼에서 실행 중인지)을 기반으로하는 응용 프로그램의 양식을 디자인하는 경우 이러한 구성 요소의 생성을 처리하기 위해 추상 팩토리를 설계해야합니다 . 당신이 다른 표현을 작성하는 팩토리 객체의 다른 인스턴스를 만들 수 있기 때문에

public MyForm() 
{ 
    GuiFactory factory = new Win32Factory(); 
    Button  btn = factory.CreateButton(); 

    btn.Text = "Go!" 
    btn.Location = new Point (15, 50); 

    this.Controls.Add (btn); 
} 

이는 추상 팩토리 패턴을 만족 : 양식에 새 컨트롤을 추가하기 위해

의 코드를 다음과 같이 보일 수 있습니다 클라이언트 코드를 변경하지 않고 생성 된 객체 (기본 예제이지만 일반적으로 새 객체를 사용하여 Win32Factory를 만들지는 않는다고 생각합니다. 다른 추상화를 통해 가져올 수 있습니다).

+0

빌더가 건물을 캡슐화했다는 인상하에 실제 빌더가 MyForm()이 this.Controls.Add (builder.BuildGoButton())을 호출하도록 예제의 단추를 리턴합니다. 예를 들면. –

+0

그래, 더 생각해 보면 내 대답을 떠났을 때 전선이 엇갈린 것 같아요. GUI를 생각할 때, 나는 실행중인 플랫폼에 따라 Button의 다른 표현을 생성하는 Abstract Factory의 사고 방식에 있었을 것입니다. – jeremyalan

0

우리가 항상 보았던 일반적인 예는 운영 체제의 "sysgen"이었습니다. 필요한 모든 모듈을 선택하고 구성한 프로세스가 있으며 사용자 정의 된 부팅 가능 이미지가 반환되었습니다.

5

주요 사용 사례 : 생성자로 모든 일을

  • 최종 결과는 불변이지만, 가 너무 복잡 할 것
  • 내가 부분적으로 뭔가 및 재사용을 구축하려는
  • 이 부분적으로 내장 된 것이지만 사용자 정의 할 때마다 끝 부분을
  • 공장 패턴으로 시작할 때, 에 의해 만들어지는 것은 공장이 너무 많은 순열을 가지고 있습니다.

요약하면 빌더는 생성자를 간단하게 유지하지만 변경하지 못하게합니다.

는 현재 C#을하지만, 사소한 자바 예제가 말했다 :

StringBuilder sb = new StringBuilder(); 
sb.append("Hello"); 
sb.append(" "); 
sb.append("World!"); 
System.out.println(sb.toString()); 

반대로 :

String msg = ""; 
msg += "Hello"; 
msg += " "; 
msg += "World!"; 
System.out.println(msg); 
+0

StringBuilder 예제는 C#에서도 거의 동일합니다. – LukeH

+0

+1 아마도 가장 완벽한 예입니다. 그리고 system.out.println (...)을 제외하고, 그것은 C#에서 컴파일되고 올바른 것입니다. –

0

사용하는 한 나는 여러 데이터 소스를 가진 경우가 발생 한 경우. 특별한 경우에는 캐시와 데이터베이스가 관련되었습니다. 대부분의 데이터는 캐시에서 가져 오거나 가져 오지 않았습니다. 두 번째 로더는 데이터를보고 캐시에서로드되었는지 확인합니다. 데이터베이스를 쿼리하여 데이터 채우기를 완료합니다.

0

가끔 non-software related example of design patterns을 이해하면 도움이 될 수 있습니다.

저는 주문을 만들기 위해 빌더를 사용하는 시스템을 사용하고 있습니다. 순서는 다른 여러 클래스로 구성된 클래스입니다. 내 빌더는 연관된 클래스를 작성하고 유효성을 검사하며, 모두 유효한 경우 주문 클래스의 인스턴스를 작성합니다. 이렇게하면 데이터가 누락 된 주문의 인스턴스를 가질 수 없다는 것을 확신 할 수 있습니다.

관련 문제