Прежде всего, я приношу свои извинения за неопределенность названия вопроса и если это уже было задано в другом месте. Я изо всех сил пытался найти подобный ответ из-за количества других вопросов "что такое шаблон, называемый".
У меня есть следующий абстрактный класс:
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
}
}
Затем это используется несколькими различными классами "item", такими как следующие, но заменяя CustomerEntity на SiteEntity/MajorEntity/MinorEntity:
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;
}
ClientProvider, SiteProvider, etcProvider - все просто содержат определенный экземпляр класса PositionProvider. Единственное различие между ними - тип сущности и перечисление RP_PositionType. Таким образом, я могу использовать ту же конкретную реализацию Sql в GetList(), чтобы отбросить все записи из конкретной таблицы на основе PositionType (PositionTypeId, когда перечисление преобразуется в значение int).
Что Аннотация Factory Шаблон. И да, это полезный и широко используемый дизайн.
Я бы сказал, что это выглядит как Factory pattern. По крайней мере, часть DalHelper.CreateInstance
.
На самом деле это шаблон Singleton
, который я считаю. Кроме того, почему вы делаете явный оператор "set" для PositionType?
Вам лучше использовать "набор" в свойстве вместо функции, это намного понятнее для разработчиков, использующих класс.