【发布时间】:2015-08-05 19:24:01
【问题描述】:
我现在正在纸上设计一个应用程序,而且我的设计有点小题大做。
该应用程序的目标是我的汽车工厂可以为我提供他们汽车模型的蓝图。蓝图不是汽车,但它描述了可以用它制造的最终汽车,例如型号名称、车辆上的选项(如空调等)。
为此,我创建了一个接口ICarBlueprint。例如,此接口上的方法可以包括getModelName() 或getOptionList()。这些方法必须适用于汽车蓝图的每个实例,无论是欧宝还是大众汽车蓝图。
一家工厂,例如欧宝或大众,可以提供一份他们的汽车蓝图清单。因此,我为工厂创建了一个接口ICarFactory。此接口包含方法getAllBlueprints(),它返回List 的ICarBluePrint 对象。对于欧宝工厂,这将是OpelBlueprint 实例,它实现了接口ICarBlueprint。
在我的主程序中,我想获取用户可以从中选择的所有可能的汽车蓝图。一个例子可能是:
for(ICarFactory f : factories)
allblueprints.addAll(f.getAllBlueprints());
然后我想遍历该列表,如果其中一个蓝图是我想要的汽车,我想建造它。但是,汽车蓝图只能由生成该蓝图的工厂建造。所以欧宝汽车的蓝图只能由OpelFactory的实例构建,从而实现接口ICarFactory。
建造汽车会产生一个实际的汽车对象。为此,我创建了接口ICar。同样,对于每个工厂,我都会有实现此接口的类。
我遇到的设计问题从这里开始。
要构建蓝图,我可以将名为 build() 的方法添加到 ICarFactory 接口。然后主程序可以简单地选择一个汽车实例,例如 goodcarBlueprint 并要求汽车工厂建造它。
因此,为了确保蓝图是由正确的工厂构建的,我正在考虑将方法 getFactory() 添加到接口 ICarBlueprint 和 build() 到 ICarFactory 接口。这将允许我在其各自的工厂中构建蓝图,如下所示:
ICarBlueprint goodcarBlueprint = // Assigned somewhere else
ICar x = goodcarBlueprint.getFactory().build(goodcarBluePrint);
但是,我的直觉告诉我这个设计真的很糟糕。任何有关正确设计方法的帮助表示赞赏。
【问题讨论】:
-
您最初使用 Factory 时,听起来像是“工厂模式”,但后来听起来像是“汽车工厂”,这些是不同的概念。你打算在这里使用哪个概念?
-
总结起来,ICarBlueprint 将因此需要对其 ICarFactory 的引用。你这样做的方式是好的。另一种方法是让所有 ICarBlueprints 成为它们来自的工厂的内部类。这样,您可以调用 ICarBlueprint.createCar() 并且 ICarBlueprint 实现将能够使用正确的工厂
-
xenoterracide 所说的,我同意你将现实工厂的概念和编程范式混为一谈
-
@xenoterracide 我确实在这里使用工厂/公司的意义。另外,为什么两票接近?这个问题有什么不好?
-
任何人给你的答案都将主要基于意见,codereview.stackexchange 和programmers.stackexchange 可能是更好的论坛。
标签: java design-patterns interface