关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。
想改进这个问题?将问题更新为 on-topic对于堆栈溢出。
7年前关闭。
Improve this question
我正在寻找设计模式来帮助解决与类实例化相关的特定问题
假设我有一个名为 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 Toyota Camry LE 实例化时,基本属性将始终相同(因为这些是 2015 Toyota Camry 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()
{
}
}
但似乎我在这里真正做的是创建类的实例作为类本身,这感觉完全不对。再加上类(class)的数量可能会增加。即使我们将其保留为 20 个模型,这仍然是项目中的 20 个额外类。
所以,这就是我在这里的原因。任何人都有任何好的想法来处理这个问题,或者任何人都知道专门为此设计的设计模式?否则我可能会选择第一个选项。
谢谢
最佳答案
纵观您的要求的明显异常,这是 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;
}
}
关于java - 寻找一种在没有数据库的情况下填充类的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27946664/