我找不到类似的问题,所以我要问自己的问题。很抱歉,如果这实际上是重复的问题。
(此外,尽管我用Java标记了这个问题,但它更像是一个普通的OOP问题)

假设我有一个这样的类层次结构:一个名为“RestaurantManager”的管理器类,其中的“Restaurants”具有“Dishes”。

创建餐厅或菜肴时,我应该在RestaurantManager之外创建它们还是将参数传递给Manager,以便它可以实例化其中的对象?

换句话说,我应该这样做:

RestaurantManager manager;
manager.addRestaurant(new Restaurant(name));

或这个:
RestaurantManager manager;
manager.addRestaurant(name);

而且,如果RestaurantManager具有餐厅或菜肴的内部标识符,该怎么办?

这更像是一个很好的实践问题,但是什么是最佳选择?

最佳答案

没有通用的“最佳”选项-两种方法都有其优缺点。

第一种方法允许您通过其他子类扩展层次结构(例如,您可以定义class Diner extends RestaurantFastFoodPlace extends Restaurant类,并将它们传递给RestaurantManager。您还可以更改Restaurant的构造函数的签名而不会影响RestaurantManager的方法。

第二种方法是让RestaurantManager从调用者那里“拥有” Restaurant的实现,并将其从外部视图中隐藏在某些接口后面。除其他事项外,它让RestaurantManager决定Restaurant是否要具有密钥,何时以及如何设置该密钥等等。

您可以根据需要选择一种或另一种方法。第一种方法在RestaurantManager之外提供了更大的灵活性,而第二种方法在RestaurantManager内提供了更好的封装。管理器和层次结构之间的耦合变得更加紧密,这使得扩展层次结构变得更加困难。

10-06 15:35