2011-03-25 2 views
2

필자는 빌더 패턴의 사용법, 특히 빌더 유형 작성 방법을 명확히하고 싶습니다. 예를 들어, 빌더의 유형을 가정하고 작성합니다. 그러나 'ChartBuilderFactory'클래스에 CreateBuilder 메소드를 작성하여 전달 된 일부 오브젝트를 기반으로 빌더 유형을 리턴합니다. 이것이 최선의 방법인가요? 필자는 샘플 코드를 게시했으며 더 나은 디자인을위한 대안과 제안을 고맙게 생각합니다.작성자 패턴의 빌더 생성

class Program 
{ 
    static void Main(string[] args) 
    { 
     DataObject data = new DataObject("basic", 2); 

     ChartDirector director = new ChartDirector(); 
     ChartBuilderFactory builderFactory = new ChartBuilderFactory(); 
     ChartBuilder builder = builderFactory.CreateChartBuilder(data); 
     director.Construct(builder); 

     Console.WriteLine(builder.GetChart()); 
     Console.ReadKey(); 
    } 
} 

class ChartBuilderFactory 
{ 
    public ChartBuilder CreateChartBuilder(DataObject data) 
    { 
     ChartBuilder builder; 
     if (data.DataType == "basic") 
      builder = new ChartBuilderBasic(data); 
     else if (data.DataType == "vector") 
      builder = new ChartBuilderVector(data); 
     else 
      builder = null; 

     return builder; 
    } 
}   

class ChartDirector 
{ 

    public void Construct(ChartBuilder builder) 
    { 
     builder.CreateChart(); 
     builder.LoadData(); 
    } 
} 

abstract class ChartBuilder 
{ 
    protected string myChartObject = ""; 
    protected DataObject data; 

    public ChartBuilder(DataObject data) 
    { 
     this.data = data; 
    } 

    abstract public void CreateChart(); 
    abstract public void LoadData(); 
    public string GetChart() { return myChartObject; } 
} 

class ChartBuilderBasic : ChartBuilder 
{ 
    public ChartBuilderBasic(DataObject data) 
     : base(data) { } 

    public override void CreateChart() 
    { 
     myChartObject = "MyBasicChart"; 
    } 

    public override void LoadData() 
    { 
     myChartObject += Convert.ToString(data.Data); 
    } 
} 

class ChartBuilderVector : ChartBuilder 
{ /** Alternative Implementation here */ } 

class DataObject 
{ 
    /** Constructor and private member variables here */ 
    public string DataType { get { return this.dataType; } } 
    public int Data { get { return this.data; } } 
} 
+0

aqwert 님의 답변에 대한 업데이트 된 질문. – Seth

답변

3

실제로 생각해 보면 공장 패턴을 사용하여 작성기 클래스를 만드는 것이 좋습니다. 디렉터는 빌더를 생성하지는 않지만 빌더를 종속시킵니다.

패턴에 대한 좋은 통찰력을 제공하고 실제 예제를 사용하는 this site을 살펴보십시오.

[편집 : 수정 질문을 기반으로] 이제 당신이 이동하도록 설정되어 공장 내부 빌더의 작성을 가지고

. 올바른 빌더의 조건/발견을 제거하려면 시스템의 크기와 복잡성에 따라 다양한 옵션이 있습니다. 빌더 및 데이터 유형의 종류의 수는 변경되지 않습니다 (또는 훨씬 전혀)

  • 빌더 간의 매핑을 가지고 사전을 통해 입력하면
    1. 는 당신이 그것을 가지고 방법을 둡니다. (더 복잡한) 아래를보십시오
    2. 또는 데이터 유형과 빌더 유형을 맵핑하는 파일을 읽음으로써 구성을 완전히 구동하십시오. (배 밖으로 조금 가고 있지만 가능)

    마지막 두 옵션을 빌더 클래스를 생성하기 위해 (액티베이터 클래스를 사용하여) 반사를 포함 할 수있다 (또는 unity 같은 일부 의존성 삽입 컨테이너), 그러나 정확한 메커니즘은 ChartBuilderFactory

    의존성 주입 (반전 제어)을 사용하는 경우 이상적으로 사용되는 방식과 다른 방식으로 개체 구성을 분리합니다. 그리고 중앙 집중화하면 나중에 제어가 쉬워지고 필요에 따라 나중에 변경할 수도 있습니다. 더 쉽게 테스트 할 수 있습니다.

  • +0

    콘크리트 제품 ​​(ChartBuilder)을 반환하는'CreateBuilder' 메서드가 포함 된 구체적인 제작자 팩토리를 가지고 계신지요? 내가 왜 추상적 인 창조주가 필요한지 모르겠다. – Seth

    +0

    작성자의 구성이 관리자의 책임이 아니기 때문에이 말을합니다. 관심사를 분리하고 싶다면이 접근법을 고려하고 싶을 것입니다. – aqwert

    +0

    질문을 업데이트하고 ChartBuilder 작성을 좀 더 린 팩토리 클래스로 분리했습니다. – Seth