2010-06-05 5 views
3

패턴을 배우려고하는데 공장 패턴이 어떤 클래스를 인스턴스화할지 결정하는 방법이나 위치를 결정하는 데 주저합니다. 팩토리를 호출하고, XML 설정 파일을 전송하여 어떤 유형의 조치를 취할지를 결정하는 어플리케이션이 있다면, 설정 파일을 해석하기위한 로직은 어디에서 발생합니까?팩토리 패턴 : 구체적인 팩토리 클래스 인스턴스화를 결정 하시겠습니까?

공장 출고

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace myNamespace 
{ 
    public abstract class SourceFactory 
    { 
     abstract public UploadSource getUploadSource(); 
    } 
    public class TextSourceFactory : SourceFactory 
    { 
     public override UploadSource getUploadSource() 
     { 
      return new TextUploadSource(); 
     } 
    } 
    public class XmlSourceFacotry : SourceFactory 
    { 
     public override UploadSource getUploadSource() 
     { 
      return new XmlUploadSource(); 
     } 
    } 
    public class SqlSourceFactory : SourceFactory 
    { 
     public override UploadSource getUploadSource() 
     { 
      return new SqlUploadSource(); 
     } 
    } 
} 

클래스

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace myNamespace 
{ 
    public abstract class UploadSource 
    { 
     abstract public void Execute(); 
    } 
    public class TextUploadSource : UploadSource 
    { 
     public override void Execute() 
     { 
      Console.WriteLine("You executed a text upload source"); 
     } 
    } 
    public class XmlUploadSource : UploadSource 
    { 
     public override void Execute() 
     { 
      Console.WriteLine("You executed an XML upload source"); 
     } 
    } 
    public class SqlUploadSource : UploadSource 
    { 
     public override void Execute() 
     { 
      Console.WriteLine("You executed a SQL upload source"); 
     } 
    } 
} 
+0

패턴을 학습하고있는 것으로 이해합니다. 프로덕션 환경에서는 공장 및 기타 작성 패턴을 구현하는 Inversion of Control Container를 사용하는 것이 좋습니다. C# 세계에서 Castle-Windsor는 일반적인 IOC 컨테이너입니다. 아래의 @peter 노트에서, 공장 로더는 설정을 해석 할 책임이 있습니다. 종종 이것은 "이 인터페이스에서이 구체적인 클래스를로드"의 형태를 취합니다. – Rob

+0

@Rob : 프로그래머 (또는 프로그래머)가 재사용 가능하고 유연하며 느슨하게 결합 된 강력한 응집력있는 소프트웨어를 설계하는 곳을 언제 알 수 있습니까? 그것은 oop가 아니며 패턴이 아닙니다. IOC이기 때문입니다. 벅은 어디에서 멈 춥니 까? –

+0

IOC는 생성 패턴을보다 쉽게 ​​구현할 수있는 도구입니다. 개인적으로, 나는 누군가가 내 일을 더 쉽게 해주는 소프트웨어를 많이 썼을 때 그것을 좋아한다. – Rob

답변

3

인스턴스화 실제 공장은 종종 별도의 팩토리 클래스 로더 런타임시 선택된다. 로더는 필요한 구성을 얻을 수 있습니다. XML 설정 파일에서, 읽어 들일 구체적인 팩토리의 클래스 명을 읽어들입니다.

이 자체는 매우 복잡한 논리는 아닙니다. 팩토리 로더 클래스에 넣는 이유는 재사용 성 때문입니다. 앱에 많은 팩토리를 가질 수 있으며 종종 팩토리로드 코드의 대부분은 매우 유사하므로 별도의 클래스 (계층 구조)에두면 코드 중복이 제거됩니다. 물론이 논리는이 예와 다르고 복잡 할 수도 있습니다.

예. 보다 동적 인 시나리오는 xml 파일의 버튼/메뉴 항목과 클래스 이름 간의 매핑을 지정하는 것이고 GUI의 경우 사용자는 버튼을 누르거나 메뉴 항목을 선택하여 사용할 팩터 리를 변경할 수 있습니다.

+0

그래서 factory 로더에 대한 인터페이스를 기반으로 한 별도의 상속 트리를 가지게 될 것입니다. 각 다른 구체적인 인스턴스화에는 어떤 객체를 생성해야하는지에 대한 특정 로직이 포함되어 있습니까? – theringostarrs

+0

@theringostarrs, 로직은 실질적으로 동일하고 하나, 구체적인 구체적인 클래스 만 다릅니다. 그래서 사람도 작곡을 사용할 수 있습니다. 가능하다면 실제로는 그것을 선호 할 것입니다. –