동일한 기본 클래스 (또는 인터페이스)를 사용하는 클래스를 만드는 팩토리를 만들려고하지만 구체적인 팩토리에는 다른 매개 변수 세트가 필요합니다. 이러한 다른 열거 형이 추가 코드가 필요하기 때문에 내가 뭔가 잘못하고있는 것처럼 느껴진다. 이 일을 더 잘할 수 있을까요?다른 매개 변수를 사용하는 팩토리 패턴 구현
클래스가 생성 될 :
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 있습니다 그들의 대표자는 런타임에 데이터를 표시했다. 간결함을 위해 뷰 모델 전용 코드를 제거했습니다.
이 될 수 있습니다
그래서 하나 개의 공장, 모든 형태의 유형과 하나 열거, 당신은 기본적으로이 수행 한 관리자를 가질 수 있습니다 [codereview.se]에 대한 좋은 질문 – null
방금 의견을 남기고 가까운 투표를하지 않았습니다. 클로즈드 투표가 "너무 광범위하다"는 이유는 귀하의 질문이 CR에 유효하지만 공개되지 않았기 때문입니다 (링크 된 메타 질문에 허용 된 답변의 표 참조). "* 대신에 너무 광범위하게 또는 주로 의견 기반으로 닫도록 투표하십시오." – null