寻找一种无需数据库即可填充 类 的设计模式
Looking for a design pattern for populating classes without a database
我正在寻找设计模式来帮助解决与 class 实例化相关的特定问题
假设我有一个名为 CarModel 的 class,它具有如下属性:
CarModel
{
string MakeName
string ModelName
int NumberOfDoors
int NumberOfLiters
string StereoMake
bool HasAC
List<Color> ColorOptions
...etc
}
假设我的应用将从代码中的多个位置为不同车型(例如 2015 Toyota Camry LE、2015 Toyota Corolla SE、2013 Ford Mustang GT 等)实例化此 class。
这些不是单例,但是每次为 2015 Toyota Camry LE 实例化时,基本属性将始终相同(因为这些是 2015 Toyota Camry LE 的属性)。将为所有车型填充所有属性(因此这不是制造商的情况)。
最后,假设无法从数据库或配置文件中获取这些属性(假设平台不支持)。
我不希望发生的是,我不希望代码中每个实例化 carModel 的地方都必须将这些属性作为参数传递给构造函数。调用者不必知道它们,而且这可能会导致错误和维护问题。
我想要发生的是,我希望调用者只指定它想要的汽车型号,并且应该填充 class。通常这样的用例我会用数据库后端来做,但同样,这不是一个选项。
我现在在想的是,我会将一个枚举值传递给构造函数,然后 class 将基于该值进行自我初始化。所以:
public CarModel(CarModelTypes cmt)
{
if(cmt == CarModelTypes.2015_Toyota_Camry_LE)
{
MakeName = "Toyota";
ModelName = "Camry";
NumberOfDoors = 4;
etc...
}
else if(cmt == CarModelTypes.2013_Ford_Mustang_GT)
{
MakeName = "Ford";
ModelName = "Mustang";
NumberOfDoors = 2;
etc
}
else if(etc...
}
我会把它放到一个单独的函数中,但你明白了。不确定我喜欢那个。感觉很丑然后我想我可以为每个继承自 CarModel 的汽车模型类型创建一个 class 并且它们可以实例化自己,所以:
public class Car2015ToyotaCamryLE : CarModel
{
string MakeName = "Toyota";
string ModelName = "Camry";
int NumberOfDoors = 4
etc
public Car2015ToyotaCamryLE()
{
}
}
但似乎我在这里真正做的是创建 classes 的实例作为 classes 本身,这感觉根本不对。另外 classes 的数量可能会增加。即使我们将它保持在 20 个模型,项目中仍然有 20 个额外的 classes。
所以,这就是我来这里的原因。任何人对处理此问题的干净方法有任何好的想法,或者任何人都知道专门为此设计的设计模式?否则我可能会选择第一个选项。
谢谢
纵观您要求的明显怪异之处,这显然是 factory method pattern。
你在中间大约一半的例子是工厂模式的反模式。如果您查看我上面链接的文章,您将看到以下内容。这似乎达到了您给定的要求,并且将此信息存储在 class 文件中是完全可以接受的,尽管以后更难更改它们(不确定在此示例中是否有必要,只是说) .
public interface ICar
{
string GetMake();
string GetModel();
}
public class ToyotaCamry : ICar
{
#region ICar Members
public string GetMake()
{
return "Toyota";
}
public string GetModel()
{
return "Camry";
}
#endregion
}
public class FordMustang : ICar
{
#region ICar Members
public string GetMake()
{
return "Ford";
}
public string GetModel()
{
return "Mustang";
}
#endregion
}
public enum CarType
{
FordMustang,
ToyotaCamry
}
/// <summary>
/// Implementation of Factory - Used to create objects
/// </summary>
public class Factory
{
public ICar GetCar(CarType type)
{
switch (type)
{
case CarType.FordMustang :
return new FordMustang();
case CarType.ToyotaCamry:
return new ToyotaCamry();
}
return null;
}
}
我正在寻找设计模式来帮助解决与 class 实例化相关的特定问题
假设我有一个名为 CarModel 的 class,它具有如下属性:
CarModel
{
string MakeName
string ModelName
int NumberOfDoors
int NumberOfLiters
string StereoMake
bool HasAC
List<Color> ColorOptions
...etc
}
假设我的应用将从代码中的多个位置为不同车型(例如 2015 Toyota Camry LE、2015 Toyota Corolla SE、2013 Ford Mustang GT 等)实例化此 class。
这些不是单例,但是每次为 2015 Toyota Camry LE 实例化时,基本属性将始终相同(因为这些是 2015 Toyota Camry LE 的属性)。将为所有车型填充所有属性(因此这不是制造商的情况)。
最后,假设无法从数据库或配置文件中获取这些属性(假设平台不支持)。
我不希望发生的是,我不希望代码中每个实例化 carModel 的地方都必须将这些属性作为参数传递给构造函数。调用者不必知道它们,而且这可能会导致错误和维护问题。
我想要发生的是,我希望调用者只指定它想要的汽车型号,并且应该填充 class。通常这样的用例我会用数据库后端来做,但同样,这不是一个选项。
我现在在想的是,我会将一个枚举值传递给构造函数,然后 class 将基于该值进行自我初始化。所以:
public CarModel(CarModelTypes cmt)
{
if(cmt == CarModelTypes.2015_Toyota_Camry_LE)
{
MakeName = "Toyota";
ModelName = "Camry";
NumberOfDoors = 4;
etc...
}
else if(cmt == CarModelTypes.2013_Ford_Mustang_GT)
{
MakeName = "Ford";
ModelName = "Mustang";
NumberOfDoors = 2;
etc
}
else if(etc...
}
我会把它放到一个单独的函数中,但你明白了。不确定我喜欢那个。感觉很丑然后我想我可以为每个继承自 CarModel 的汽车模型类型创建一个 class 并且它们可以实例化自己,所以:
public class Car2015ToyotaCamryLE : CarModel
{
string MakeName = "Toyota";
string ModelName = "Camry";
int NumberOfDoors = 4
etc
public Car2015ToyotaCamryLE()
{
}
}
但似乎我在这里真正做的是创建 classes 的实例作为 classes 本身,这感觉根本不对。另外 classes 的数量可能会增加。即使我们将它保持在 20 个模型,项目中仍然有 20 个额外的 classes。
所以,这就是我来这里的原因。任何人对处理此问题的干净方法有任何好的想法,或者任何人都知道专门为此设计的设计模式?否则我可能会选择第一个选项。
谢谢
纵观您要求的明显怪异之处,这显然是 factory method pattern。
你在中间大约一半的例子是工厂模式的反模式。如果您查看我上面链接的文章,您将看到以下内容。这似乎达到了您给定的要求,并且将此信息存储在 class 文件中是完全可以接受的,尽管以后更难更改它们(不确定在此示例中是否有必要,只是说) .
public interface ICar
{
string GetMake();
string GetModel();
}
public class ToyotaCamry : ICar
{
#region ICar Members
public string GetMake()
{
return "Toyota";
}
public string GetModel()
{
return "Camry";
}
#endregion
}
public class FordMustang : ICar
{
#region ICar Members
public string GetMake()
{
return "Ford";
}
public string GetModel()
{
return "Mustang";
}
#endregion
}
public enum CarType
{
FordMustang,
ToyotaCamry
}
/// <summary>
/// Implementation of Factory - Used to create objects
/// </summary>
public class Factory
{
public ICar GetCar(CarType type)
{
switch (type)
{
case CarType.FordMustang :
return new FordMustang();
case CarType.ToyotaCamry:
return new ToyotaCamry();
}
return null;
}
}