一个以上的对象可以聚合或认识或实例化同一个对象吗?

时间:2019-06-06 13:33:07

标签: design-patterns aggregation

Gamma等人说的设计模式

  

考虑对象聚集和相识之间的区别,以及它们在编译时和运行时表现出差异的方式。

     

聚集表示一个对象拥有另一个对象或对该对象负责。通常,我们说的是一个物体具有另一个物体或者是另一个物体的一部分。聚合意味着聚合对象及其所有者具有相同的生存期。

     

相识意味着一个对象仅知道另一个对象。有时相识被称为“关联”或“使用”关系。熟悉的对象可能会要求对方进行操作,但彼此之间不承担责任。相识的关系比聚合的关系弱,并且建议耦合更宽松   在对象之间。

     

要显示的另一个有用的事情是哪些类实例化了其他类。我们称之为   “创造”关系。箭头指向实例化的类。在图c中,

     

enter image description here

多个对象可以聚合同一对象吗? 如果对象A聚合了对象B,那么另一个对象说C也可以聚合B吗?

一个对象可以认识多个对象吗? 如果对象A认识对象B,另一个对象说C也可以认识B吗?

多个对象可以实例化同一个对象吗?

1 个答案:

答案 0 :(得分:2)

据我的理解和我所知道的常见定义,组成是一种关联,其中关联对象的生存期与所有者的生存期相关。 Aggregation 描述了一种关联,其中聚合对象的生存期独立于所有者的生存期。 相识关联相同。

根据此定义,一个对象可以由多个所有者以 aggregate 关联的形式进行聚合。如果关联的类型为 composition ,则按定义不打算共享。

关联相识是对象之间关系的更通用描述。因此,如果一个对象可以有多个所有者,则取决于关系的细节。但是当使用通用名称时,通常是可能的。

Wikipedia Object composition and aggregation

但是我认为还有另外一个定义是马丁·福勒(Martin Fowler)提出的。这是您所引用的。对我而言,这是鲜为人知的定义,因为我提供的定义是在UML规则中定义的,而UML规则已广泛传播并已成为事实上的标准。根据M. Fowler的定义, aggregation 等于 composition ,而 agraintance 匹配 aggregation 的UML定义。

因此,您的问题的答案是,从M. Fowler的眼睛看:组成的规则适用于谈论Fowler的 aggregation ,这意味着多个所有者可以不会按照相识来聚集相同的对象,这适用于UML定义的 aggregation 关联中的规则,这意味着多个所有者可以熟悉相同的对象(从它们的寿命开始)。0

当然,您可以根据需要或在可用内存以及所需位置创建对象实例的次数。对象或类仅是定义,而实例(作为实例化的结果)是实际分配的存储区域,用于存储对象的数据(例如字段)。类定义描述了此分配的内存区域的布局。