我找不到类似的问题,所以我要问自己的问题。很抱歉,如果这实际上是重复的问题。
(此外,尽管我用Java标记了这个问题,但它更像是一个普通的OOP问题)
假设我有一个这样的类层次结构:一个名为“RestaurantManager”的管理器类,其中的“Restaurants”具有“Dishes”。
创建餐厅或菜肴时,我应该在RestaurantManager之外创建它们还是将参数传递给Manager,以便它可以实例化其中的对象?
换句话说,我应该这样做:
RestaurantManager manager;
manager.addRestaurant(new Restaurant(name));
或这个:
RestaurantManager manager;
manager.addRestaurant(name);
而且,如果RestaurantManager具有餐厅或菜肴的内部标识符,该怎么办?
这更像是一个很好的实践问题,但是什么是最佳选择?
最佳答案
没有通用的“最佳”选项-两种方法都有其优缺点。
第一种方法允许您通过其他子类扩展层次结构(例如,您可以定义class Diner extends Restaurant
和FastFoodPlace extends Restaurant
类,并将它们传递给RestaurantManager
。您还可以更改Restaurant
的构造函数的签名而不会影响RestaurantManager
的方法。
第二种方法是让RestaurantManager
从调用者那里“拥有” Restaurant
的实现,并将其从外部视图中隐藏在某些接口后面。除其他事项外,它让RestaurantManager
决定Restaurant
是否要具有密钥,何时以及如何设置该密钥等等。
您可以根据需要选择一种或另一种方法。第一种方法在RestaurantManager
之外提供了更大的灵活性,而第二种方法在RestaurantManager
内提供了更好的封装。管理器和层次结构之间的耦合变得更加紧密,这使得扩展层次结构变得更加困难。