我目前正在纸上设计一个应用程序,但我在设计方面有点困惑。
该应用程序的目标是我的汽车工厂可以为我提供他们的汽车模型的蓝图。蓝图不是一辆汽车,但它描述了可以用它 build 的最终汽车,例如型号名称、车辆上的选项(如空调等)。
为此,我创建了一个接口(interface)ICarBlueprint
。例如,此接口(interface)上的方法可能包括 getModelName()
或 getOptionList()
。这些方法必须适用于汽车蓝图的每个实例,无论是欧宝还是大众汽车蓝图。
工厂,例如欧宝或大众,可以提供他们的汽车蓝图列表。对于工厂,我创建了一个接口(interface)ICarFactory
。此接口(interface)包含方法 getAllBlueprints()
,该方法返回 ICarBluePrint
对象的 List
。对于 Opel 工厂,这将是 OpelBlueprint
实例,它实现接口(interface) ICarBlueprint
。
在我的主程序中,我想获取用户可以选择的所有可能的汽车蓝图。一个例子可以是:
for(ICarFactory f : factories)
allblueprints.addAll(f.getAllBlueprints());
然后我想迭代该列表,如果其中一个蓝图是我想要的汽车,我想 build 它。然而,汽车蓝图只能由生成该蓝图的工厂来 build 。因此,欧宝汽车的蓝图只能通过 OpelFactory
的实例构建,从而实现接口(interface) ICarFactory
。
build 一辆汽车会产生一个实际的汽车对象。为此,我创建了接口(interface)ICar
。同样,对于每个工厂,我都会有实现此接口(interface)的类。
我的设计问题从这里开始。
要构建蓝图,我可以将名为 build()
的方法添加到 ICarFactory
接口(interface)。然后,主程序可以简单地选择一个汽车实例,例如 goodcarBlueprint
并要求汽车工厂来构建它。
因此,为了确保蓝图是由正确的工厂构建的,我正在考虑向接口(interface) ICarBlueprint
和 添加方法
到 getFactory()
build()ICarFactory
接口(interface)。这样我就可以在各自的工厂中构建一个蓝图,如下所示:
ICarBlueprint goodcarBlueprint = // Assigned somewhere else
ICar x = goodcarBlueprint.getFactory().build(goodcarBluePrint);
但是,我的直觉告诉我,这个设计非常糟糕。任何有关正确设计方法的帮助都将受到赞赏。
最佳答案
这是非常主观的,我理解那种糟糕设计的感觉,但我不会称你的想法“非常糟糕”。
对我来说,这听起来像是经典Builder design pattern 。在这种情况下,蓝图就是构建器。大多数构建器都有 .build() 方法。通过在蓝图上调用 .build() ,您将避免从工厂检索蓝图而只需使用它为您提供的蓝图再次调用工厂。蓝图仍然需要了解它自己的工厂,以便它可以让工厂 build 汽车。
关于java - OO 设计问题接口(interface)和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31841124/