java - OO 设计问题接口(interface)和类

标签 java design-patterns interface

我目前正在纸上设计一个应用程序,但我在设计方面有点困惑。

该应用程序的目标是我的汽车工厂可以为我提供他们的汽车模型的蓝图。蓝图不是一辆汽车,但它描述了可以用它 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/

相关文章:

java - 如何将 cloudhopper 演示作为 Java 应用程序运行?

java - 如何从命令行安装 pom 文件中提到的插件,而不编译或构建整个项目?

java - JMeter 5.1 java.lang.OutOfMemoryError : Java heap space - clear results does not help (did in 2. 13)

javascript - 管理 Web 应用程序中全局需要的服务

java - 如何检查接口(interface)列表中使用了哪个实现

java - 在不使用 Java.Runtime 的情况下用 Java 解密 gpg

c# - 将父类(super class)转换为特定的派生类型

iphone - 键盘上推阻塞 TextView 的设计模式

java - 为什么编码应该是 "to the interface"特别是对于原始数据类型?

unit-testing - 在 golang 中实现嵌套接口(interface)