2009-11-02 140 views
1

我有不少的情况是所有相关的概念类,但有些更因此在细节比别人水平。例如,这三个类具有几乎相同的特性(虽然成员函数将变化):申请创力设计/模式建议

public class RelatedA : IRelatedType 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public DateTime Stamp { get; set; } 
} 

public class RelatedB : IRelatedType 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public DateTime Stamp { get; set; } 
} 

public class RelatedC : IRelatedType 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public DateTime Stamp { get; set; } 
    public int Special { get; set; } 
} 

有几个被概念性地与上述有关的其他3个类,但可以是一个有点不同的实现逐:

public class RelatedD : IRelatedType 
{ 
    public string Name { get; set; } 
    public string Statement { get; set; } 
} 

public class RelatedE : IRelatedType 
{ 
    public string Name { get; set; } 
    public string Statement { get; set; } 
    public bool IsNew { get; set; } 
} 

这些的实例可以由基于某种“类型”枚举值的工厂创建。问题是,后来当正在使用这些对象(在业务层,例如),可能有很多这样的代码:

IRelatedType theObject = TheFactory.CreateObject(SomeEnum.SomeValue); 

if (theObject is RelatedC) 
{ 
    RelatedC cObject = theObject as RelatedC; 
    specialVal = cObject.Special; 
} 
else if (theObject is RelatedD) 
{ 
    RelatedD dObject = theObject as RelatedD; 
    statementVal = dObject.Statement; 
} 
else if (theObject is RelatedE) 
{ 
    RelatedE eObject = theObject as RelatedE; 
    statementVal = eObject.Statement; 
    isNewVal = eObject.IsNew; 
} 

这可以在很多地方重复。有没有更好的方法来设计我应该使用的(必须)?

回答

1

你可以尝试和生产要素的差异成单独的类,然后例如设置:

IRelatedType theObject = TheFactory.CreateObject(SomeEnum.SomeValue); 
RelatedTypeHelper theHelper=TheFactory.CreateHelper(theObject); 
theHelper.DoSpecialThing(theObject); 

那么现在就必须有所有的if else块,如果你添加一个新的类型这就需要新的操作,您只需掀起新的辅助实现所需的碎片,你应该是好去。帮手应该帮助记录这个过程。

我还要问,为什么一个单一的方法会对specialVal和StatementVal这种不同的实现可能是你的样品,但它使我好奇你真的在这里做什么。您可以简化东西回来后退一步,并质疑被包括在这个特定层次结构的这些点。