我正在寻找设计模式来帮助解决与类实例化相关的特定问题
假设我有一个名为CarModel的类,它具有以下属性:
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等)。
这些不是单身人士,但每次实验2015款丰田凯美瑞LE时,基本属性都将保持不变(因为这些是2015款丰田凯美瑞LE的特性)。所有汽车型号的所有属性都将被填满(所以这不是建筑商的情况)。
最后,假设无法从数据库或配置文件中获取这些属性(假设平台不支持它)。
我不想发生的事情是,我不希望carModel实例化的代码中的每个地方都必须将这些属性作为参数传递给构造函数。调用者不应该知道它们,加上它可能导致错误和维护问题。
我想要发生的是,我希望调用者只指定它想要的汽车模型,并且应该填充类。通常这样的用例我会使用数据库后端,但同样,这不是一个选项。
我现在正在思考的是,我将枚举值传递给构造函数,并且类将基于此进行初始化。所以:
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继承的每个汽车模型类型创建一个类,它们可以自己实例化,所以:
public class Car2015ToyotaCamryLE : CarModel
{
string MakeName = "Toyota";
string ModelName = "Camry";
int NumberOfDoors = 4
etc
public Car2015ToyotaCamryLE()
{
}
}
但似乎我在这里真正做的是创建类本身的实例,这根本不是正确的。加上课程数量可以增长。即使我们将它保留在20个模型中,该项目中还有20个额外的课程。
所以,这就是我在这里的原因。任何人都有一个干净的方式处理这个或任何人知道专门为此设计的设计模式的好主意?否则,我可能会选择第一个选项。
由于
答案 0 :(得分:2)
回顾一下你的要求明显奇怪,这是factory method pattern的一个明显例子。
中间大约一半的例子是工厂模式的确切反模式。如果您查看我上面链接的文章,您将看到以下内容。这似乎可以达到您的要求,并且将此信息存储在类文件中是完全可以接受的,但这会使以后更改它们变得更加困难(不确定在此示例中是否有必要,只是说)。
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;
}
}