我正在尝试将创建模式应用于以下业务域。我不确定它是否是正确的解决方案,但我一直在查看工厂和构建器模式,但我可能会尝试应用错误的模式。以下是以下域名:
所以上面我有一个技术规范的业务对象,我只是展示了两个例子,但它们最多可以是N个对象。这适用于技术规范的属性,每个规范最多可以有N个属性。
如果我想返回技术规范的属性,我正在尝试使用上面提到的模式以抽象的方式对此进行编码。我被迫施展他们,对这种情况适用的模式有任何建议吗?
以下是我正在尝试做的一些代码示例,请参阅下文。在main函数中,我可以构建我的规范对象,但是如果我想在不进行强制转换的情况下访问规范对象的具体属性。我希望这能澄清一些事情。
主要功能:
class Program
{
static void Main(string[] args)
{
TechnicalSpecificationBuilder visual = new VisualSpecificationBuilder();
TechnicalSpecificationBuilder audio = new AuditorySpecificationBuilder();
//TODO, how do I get acces to properties without Casting?
Specification visualSpec = visual.CreateSpecification();
Specification audiotSpec = audio.CreateSpecification();
}
}
Abstract Tech Spec Builder:
public abstract class TechnicalSpecificationBuilder
{
public Specification CreateSpecification()
{
return BuildSpecification();
}
protected abstract Specification BuildSpecification();
}
Visual Tech Spec Builder:
public class VisualSpecificationBuilder : TechnicalSpecificationBuilder
{
protected override Specification BuildSpecification()
{
// TODO: Implement this method
return new VisualSpecification();
}
}
摘要规范:
public abstract class Specification
{
}
视觉规范:
public class VisualSpecification : Specification
{
public string FieldOfView { get; set; }
public bool IsBinocularVisionCapable { get; set; }
public bool IsHeadTrackingCapable { get; set; }
public bool IsEyeTrackingCapable { get; set; }
public string Resolution { get; set; }
}
答案 0 :(得分:1)
以下应该做的 - 使用构建器类的通用基类,并使具体的规范子类成为类型参数。
public abstract class TechnicalSpecificationBuilder<TSpecification>
where TSpecification : Specification
{
public TSpecification CreateSpecification()
{
return this.BuildSpecification();
}
protected abstract TSpecification BuildSpecification();
}
public class VisualSpecificationBuilder : TechnicalSpecificationBuilder<VisualSpecification>
{
protected override VisualSpecification BuildSpecification()
{
return new VisualSpecification();
}
}
我还建议考虑使用接口ISpecification
代替或与基类Specification
一起使用 - 如果您达到具体规范类无法从您的基类派生的点,这可能会有所帮助无论出于何种原因。