2016-07-29 3 views
0

동일한 기본 클래스 (또는 인터페이스)를 사용하는 클래스를 만드는 팩토리를 만들려고하지만 구체적인 팩토리에는 다른 매개 변수 세트가 필요합니다. 이러한 다른 열거 형이 추가 코드가 필요하기 때문에 내가 뭔가 잘못하고있는 것처럼 느껴진다. 이 일을 더 잘할 수 있을까요?다른 매개 변수를 사용하는 팩토리 패턴 구현

클래스가 생성 될 :

public interface IShapeData {} 

public abstract class ShapeDataWithCorners : IShapeData 
{ 
    public double Width { get; set; } 
} 

class Square : ShapeDataWithCorners {} 

class Rectangle : ShapeDataWithCorners 
{ 
    public double Height { get; set; } 
} 

class Circle : IShapeData 
{ 
    public double Radius { get; set; } 
} 

class Oval : IShapeData 
{ 
    public double Radius1 { get; set; } 
    public double Radius2 { get; set; } 
} 

공장 :

public enum RoundShapeTypes 
{ 
    Circle, 
    Oval 
} 

public enum CornerShapeTypes 
{ 
    Square, 
    Rectangle 
} 

public class RoundShapeDataFactory : IShapeDataFactory 
{ 
    private readonly RoundShapeTypes m_shapeType; 

    public RoundShapeDataFactory (RoundShapeTypes shapeType) 
    { 
     m_shapeType = shapeType; 
    } 

    public IShapeData CreateShapeData() 
    { 
     switch (m_shapeType) 
     { 
      case RoundShapeTypes.Circle: 
       return new Circle(); 
      case RoundShapeTypes.Oval: 
       return new Oval(); 
     } 
    } 
} 

public class CornerShapeDataFactory : IShapeDataFactory 
{ 
    private readonly CornerShapeTypes m_shapeType; 

    public CornerShapeDataFactory (CornerShapeTypes shapeType) 
    { 
     m_shapeType = shapeType; 
    } 

    public IShapeData CreateShapeData() 
    { 
     switch (m_shapeType) 
     { 
      case CornerShapeTypes.Square: 
       return new Square(); 
      case CornerShapeTypes.Rectangle: 
       return new Rectangle(); 
     } 
    } 
} 
공장에 전화

클래스 :

public class RoundShapeManager 
{ 
    public IShapeData CurrentShapeData{get; set; } 

    public void SetShapeType (RoundShapeTypes shapeType) 
    { 
     RoundShapeDataFactory factory = new RoundShapeDataFactory (shapeType); 
     CurrentShapeData = factory.CreateShapeData(); 
    } 
} 

public class CornerShapeManager 
{ 
    public IShapeData CurrentShapeData {get; set; } 

    public void SetShapeType (CornerShapeTypes shapeType) 
    { 
     CornerShapeDataFactory factory = new CornerShapeDataFactory (shapeType); 
     CurrentShapeData = factory.CreateShapeData(); 
    } 
} 

이 "관리자"는 변경할 수 있습니다 것입니다 실제로 WPF의 viewmodels 있습니다 그들의 대표자는 런타임에 데이터를 표시했다. 간결함을 위해 뷰 모델 전용 코드를 제거했습니다.

+0

이 될 수 있습니다

public interface IShapeData { } public abstract class ShapeDataWithCorners : IShapeData { public double Width { get; set; } } public class Square : ShapeDataWithCorners { } public class Rectangle : ShapeDataWithCorners { public double Height { get; set; } } public class Circle : IShapeData { public double Radius { get; set; } } public class Oval : IShapeData { public double Radius1 { get; set; } public double Radius2 { get; set; } } public enum ShapeType { Circle, Oval, Square, Rectangle } public interface IShapeDataFactory { IShapeData CreateShapeData(ShapeType shapeType); } public class ShapeDataFactory : IShapeDataFactory { public IShapeData CreateShapeData(ShapeType shapeType) { switch (shapeType) { case ShapeType.Circle: return new Square(); case ShapeType.Oval: return new Oval(); case ShapeType.Rectangle: return new Rectangle(); case ShapeType.Square: return new Square(); default: throw new ArgumentException("invalid shape type"); } } } 

그래서 하나 개의 공장, 모든 형태의 유형과 하나 열거, 당신은 기본적으로이 수행 한 관리자를 가질 수 있습니다 [codereview.se]에 대한 좋은 질문 – null

+1

방금 ​​의견을 남기고 가까운 투표를하지 않았습니다. 클로즈드 투표가 "너무 광범위하다"는 이유는 귀하의 질문이 CR에 유효하지만 공개되지 않았기 때문입니다 (링크 된 메타 질문에 허용 된 답변의 표 참조). "* 대신에 너무 광범위하게 또는 주로 의견 기반으로 닫도록 투표하십시오." – null

답변

1

이 그것을 줄일 수

IShapeDataFactory s = new ShapeDataFactory(); 
IShapeData temp = s.CreateShapeData(ShapeType.Square); 
+0

UI에 유효한 옵션을 표시하기 위해 별도의 enum을 사용해야했습니다. UI 측에서 팩토리를 호출 할 때 단일 열거 형을 사용하는 변환이 발생할 수 있다고 가정합니다. – kbeal2k

+0

이것은 의미가 있습니다. 반환 할 팩토리를 팩토리에 알려주는 매개 변수는 팩토리의 생성자가 아니라'Create' 메쏘드에 들어 있습니다 (응답에 나와 있습니다). 클래스가 어떤 생성자 인수를 팩토리에 전달해야 하는지를 알아야한다면 클래스는 팩토리를 생성하는 책임을지게되고 이는 팩토리의 목적을 상실하게됩니다. –

+0

@ScottHannen - 동의 함. 책임은 공장에만 있으며 공장 주위에는 포장지가 아닙니다. – Ric