C#工厂问题

时间:2010-10-21 21:16:38

标签: c# design-patterns factory-pattern

考虑下面的工厂方法,它采用一些元数据并创建相关类型的列。

在遇到依赖于一些其他数据(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);
    }

2 个答案:

答案 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等)决定在创建编辑器时要做什么建设者。它还可以帮助您满足一些非功能性要求,例如可扩展性和可管理性。