考虑下面的工厂方法,它采用一些元数据并创建相关类型的列。
在遇到依赖于一些其他数据(ColumnType.DropDownList)的列之前,它一切都很好。这需要一些额外的数据(值列表)用于显示目的。
我不想在元数据级别提供此数据,因此在工厂中创建对象时提供此数据似乎是明智的。但是我正在努力寻找一种优雅的方法来将清单纳入工厂方法(参见评论:不能在这里进行硬编码!!!)
有什么想法吗?我对任何人开放!
public static DetailEditorColumn<int> Create(ColumnMetaData metaData)
{
if (metaData.ColumnType == ColumnType.Rank)
{
return GridColumnBuilder<int>.GetRankColumn(metaData.DisplayOrder, metaData);
}
if (metaData.ColumnType == ColumnType.Decision)
{
return GridColumnBuilder<int>.GetDecisionColumn(metaData.DisplayOrder, metaData);
}
if (metaData.ColumnType == ColumnType.Date)
{
return GridColumnBuilder<int>.GetDateColumn(metaData.DisplayOrder, metaData);
}
if (metaData.ColumnType == ColumnType.DropDownList)
{
// TODO where the humf should this get plugged in!
// cant BE HARDCODED HERE!!!
DropDownList lookupList = new DropDownList()
{
new DropDownListOption() { Id = 1, Value = "Entry 1", ParenTId = null },
new DropDownListOption() { Id = 2, Value = "Entry 1", ParenTId = null },
new DropDownListOption() { Id = 3, Value = "Entry 1", ParenTId = null }
};
return GridColumnBuilder<int>.GetDropDownListColumn(metaData.DisplayOrder, metaData, lookupList);
}
throw new Exception("Column Type Not Supported " + metaData);
}
答案 0 :(得分:2)
使用带有附加参数的函数重载函数。
public static DetailEditorColumn<int> Create(ColumnMetaData metaData, List<T> lookupList)
{
//what is coded above
if (metaData.ColumnType == ColumnType.DropDownList)
{
if (lookupList == null)
//handle error
else
return GridColumnBuilder<int>.GetDropDownListColumn(metaData.DisplayOrder, metaData, lookupList);
}
}
public static DetailEditorColumn<int> Create(ColumnMetaData metaData)
{
return ClassName.Create(metaData, null);
}
答案 1 :(得分:1)
如果你想要更优雅的解决方案,我肯定建议在这里使用Visitor Pattern让每个具体的ColumnMetaData(如Rank,Date,DropDown等)决定在创建编辑器时要做什么建设者。它还可以帮助您满足一些非功能性要求,例如可扩展性和可管理性。