首先,我为问题标题的含糊不清而道歉,如果已经在别处问过这个问题。我很难找到一个类似的答案,因为其他“这种模式称为'问题的数量。”
我有以下抽象类:
public abstract class PositionProvider<T> : DalProvider<T>, IDalProvider
where T : IPositionEntity
{
protected PositionProvider()
: base() { }
public RP_PositionType PositionType
{
get
{
return _positionType;
}
}
private RP_PositionType _positionType;
public abstract List<T> GetList();
internal void SetPositionType(RP_PositionType positionType)
{
if (_positionType == null)
{
_positionType = positionType;
}
else
{
throw new NotSupportedException(
"PositionType can only be set once.");
}
}
}
然后我得到了这个类的具体实现:
public class SqlPositionProvider<T>
: PositionProvider<T> where T : IPositionEntity
{
public override List<T> GetList()
{
int positionTypeId = (int)this.PositionType;
// Return the matching items here
}
}
然后由许多不同的“项目”类使用,例如以下内容,但用SiteEntity / MajorEntity / MinorEntity替换CustomerEntity:
public class CustomerProvider
{
public static PositionProvider<CustomerEntity> Instance
{
get
{
if (_instance == null)
{
DalHelper.CreateInstance<PositionProvider<CustomerEntity>>(
out _instance);
_instance.SetPositionType(RP_PositionType.Customer);
}
return _instance;
}
}
private static PositionProvider<CustomerEntity> _instance;
}
CustomerProvider,SiteProvider和etcProvider都只是持有PositionProvider类的特定实例。它们之间的唯一区别是实体类型和RP_PositionType枚举。这样我就可以在GetList()中使用相同的Sql具体实现,根据PositionType(枚举转换为int值时的PositionTypeId)从特定表中撤回所有记录。
答案 0 :(得分:2)
我会说这看起来像Factory pattern。至少是DalHelper.CreateInstance
部分。
答案 1 :(得分:2)
那是Abstract Factory Pattern。是的,它是一种有用且广泛使用的设计模式。
答案 2 :(得分:0)
这实际上是我认为的Singleton
模式。另外,为什么要为PositionType做一个明确的'set'语句?
你最好在属性中使用'set'而不是函数,对于使用该类的开发人员来说更清楚。