构建工厂模式的通用方法
本文关键字:方法 工厂 模式 构建 | 更新日期: 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
,然后可以使用工厂模式创建所需类型的对象。
同样,通过这种方式,您还可以减少对反射的依赖,因此您的代码在性能方面可能会更好一些。
希望这能有所帮助。