2013-05-18 2 views
2

다른 유형의 파트 (C#)를 사용하여 로봇을 빌드하는 프로그램에 대한 솔루션을 만들고 있습니다. 이 경우에는 몇 가지 특성을 공유하는 두 가지 유형이 있으며 두 가지 유형의 부분이 추상 클래스 Part에서 상속됩니다.매개 변수가있는 팩토리 메서드의 구현 수정

지금까지는 인터페이스 윈도우의 실제 버튼 코드에서 new를 호출하고있었습니다.

if (type == acuatic) 
    Part pieceA = new AcuaticPart(type,name,price,maxDepth); 
else 
    Part pieceB = new TerrestrialPart(type,name,price,terrain,maxTemp); 

저는 이것이 완전히 잘못된 디자인이며 Factory Method를 구현해야한다는 것을 알고 있습니다. 인터페이스 창에서

: 콘크리트 공장에서

Part piece = _partFactory.CreatePart(type,name,price,maxDepth,terrain,maxTemp); 

:

public class ConcretePartFactory : PartFactory 
{ 
    public override Part CreatePart(type,name,price,maxDepth,terrain,maxTemp) 
    { 
     Part myPart = default(Part); 
     switch (type) 
     { 
      case "actuatic": 
       myPart = new AquaticPart(type,name,price,maxDepth); 
       break; 
      case "terrestrial": 
       myPart = new TerrestrialPart(type,name,price,terrain,maxTemp); 
       break; 
     } 
     return myPart; 
    } 
} 
것은 그냥 이런 공장으로 모든 매개 변수를 전송 할 수있는 상태인지 모르겠어요입니다

문제는 여전히 모든 속성을 전달해야하며 이것이 공개/종결 된 원칙을 따르지 않는다고 생각합니다.이 문제를 해결하려면 어떻게해야합니까? 감사!

+0

assignign myPart = default (myPart)는 case 문 기본값에 있어야합니다. – CSharpie

답변

3

언급 한 입력 인수에 해당하는 다른 서명으로 팩토리 메서드를 오버로드 할 수 있습니다. 이 경우, 동일한 이름을 가진 두 개의 메소드를 구현하고, 다른 클래스의 객체를 리턴하는 적절한 인수 세트를 가져야합니다. 이 방법을 사용하면 "유형"도 함께 삭제 될 수 있습니다.

1

팩토리 메서드가 아닌 추상 팩터 리로이 작업을 수행 할 수 있습니다. 초록 공장이 부품을 생성합니다. 그런 다음 생성하려는 각 파트에 대해 추상 팩토리에서 파생 된 구체적인 팩터 리를 만듭니다. 이렇게하면 각 콘크리트 팩토리가 해당 부분에 대해서만 알고 있으므로 형식 검사를 중단 할 수 있습니다. PartFactory를 상속함으로써 거의 이것을 얻었습니다.

이 접근법의 유일한 문제점은 서로 다른 부분에 다른 데이터 조각이 필요하다는 것입니다. 이것은 추상적 인 Create() 메소드 뒤에는 불가능합니다. 그것은 구체적인 공장의 생성자에서 처리 될 수 있습니다. 그러나 이는 공장의 평생 동안 그 값에 집착 한 것을 의미합니다.

관련 문제