构建工厂模式的通用方法

本文关键字:方法 工厂 模式 构建 | 更新日期: 2023-09-27 17:58:30

我有三个对象,它们具有相同的属性,但有些不同——每个对象都有Id、Name和TypeCode。在数据库中,我们有一个包含Id、Name和TypeCode字段的第一个表,还有另外三个表,每个表都包含每个对象的相应属性:

表1:Id|Name|TypeCode

表2:Id|FunctionName

表3:Id|AnalysisName

表4:Id|PropertyName

我们有一个名为"GetProperties"的storedProcdure,它根据对象的TypeCode返回对象的属性。"GetProperties"接受一个参数,即对象Id。在调用存储过程之前,我们不知道TypeCode。

如果TypeCode是一个函数,则返回以下字段:

Id,Name,TypeCode,FunctionName

如果TypeCode是Analysis,则返回以下字段:

Id,Name,TypeCode,AnalysisName

等等…

我创建了4个类:FunctionObject、AnalysisObject和PropertyObject,它们继承自类MyObject。

public class MyObject
{
     public decimal Id;
     public string Name;
     public string TypeCode;
}
public class FunctionObject: MyObject
{
    public string FunctionName;
}
public class AnalysisObject: MyObject
{
    public string AnalysisName;
}
public class PropertyObject: MyObject
{
    public string PropertyName;
}

我创建了一个通用函数,允许我动态创建对象:

    public T GetObject<T>(string storedProcedure, List<DataBaseParameteres> parameters) where T: new()
{
    T result = new T();
    OpenConnection();
    SqlDataReader reader = ExecuteSqlCommand(storedProcedure, parameters);
    PropertyInfo[] properties = typeOf(T).GetProperties();
    if(reader.Read())
    {
        for(int i = 0; i<properties.Count(); i++)
        {
            object value = Convert.ChangeType(reader[properties[i].Name], properties[i].PropertyType);
            properties[i].SetValues(result, value, null);
        }
    }
    reader.Close();
    CloseConnection();
    return result;
}

这个函数运行得很好,我可以如下调用它,它返回创建的对象:

MyObject obj1 = GetObject<MyObject>(obj1Id);

我现在的问题是,我想知道如何修改通用方法"GetObject"来创建对象:FunctionObject、AnalysisObject和Propertyobject。在调用函数时,我对TypeCode一无所知,所以我不能这样做,除非我有TypeCode:

FunctionObject obj2 = GetObject<FunctionObject>(obj2Id);

构建工厂模式的通用方法

我认为,根据您的场景,不可能创建这些类型的对象。原因是您在同一方法中嵌入了对存储过程的调用和对象的创建,并将它们混合在一起。

我的建议是将对存储过程的调用从该方法移除到另一个方法,将该存储过程执行到数据表,并将该数据表传递给该方法。通过这种方式,您将提前获得TypeCode,然后可以使用工厂模式创建所需类型的对象。

同样,通过这种方式,您还可以减少对反射的依赖,因此您的代码在性能方面可能会更好一些。

希望这能有所帮助。