【问题标题】:Can more than one objects aggregate or acquaint or instantiate the same object?多个对象可以聚合、认识或实例化同一个对象吗?
【发布时间】:2019-10-22 00:59:21
【问题描述】:

Gamma 等人所说的设计模式

考虑对象聚合和熟人之间的区别,以及它们在编译和运行时的表现方式有何不同。

聚合意味着一个对象拥有或负责另一个对象。通常我们说一个对象具有或属于另一个对象。聚合意味着聚合对象及其所有者具有相同的生命周期。

相识意味着一个对象只知道另一个对象。有时熟人被称为“联想”或“使用”关系。熟悉的对象可以相互请求操作,但不相互负责。熟人关系比聚合关系更弱,表明耦合更松散 对象之间。

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

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

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

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

【问题讨论】:

    标签: design-patterns aggregation


    【解决方案1】:

    根据我的理解和我所知道的常见定义,Composition 是一种关联,其中关联对象的生命周期与所有者的生命周期相关联。 聚合 描述了一种关联,其中聚合对象的生命周期独立于所有者的生命周期。 熟人和联想一样。

    根据这个定义,一个对象可以由一个聚合关联中的多个所有者聚合。如果关联是 composition 类型,则根据定义,共享是不打算的。

    Association 或 acquaintance 是对对象之间关系的更通用的描述。因此,如果单个对象可以有多个所有者,则取决于关系的详细信息。但是,如果是通用的,通常是可能的。

    Wikipedia Object composition and aggregation

    但我认为 Martin Fowler 引入了另一个定义。就是你引用的那个。对我来说,这是一个鲜为人知的定义,因为我呈现的定义是在 UML 规则中定义的,这些规则被广泛传播并已成为事实上的标准。根据 M. Fowler 的定义,aggregation 等于 composition,而 acquaintance 匹配 aggregation 的 UML 定义。

    因此,您的问题的答案是,从 M. Fowler 的角度来看:composition 的规则适用于 Fowler 的聚合,这意味着多个所有者可以'不聚合相同的对象并且根据熟人在UML定义的聚集关联的规则应用意味着多个所有者可以熟识相同的对象独立(从它们的生命周期开始)。0

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

    【讨论】:

    • 谢谢。 “要展示的另一个有用的东西是哪些类实例化了哪些其他类。我们称之为‘创建’关系。”怎么样?多个对象可以实例化同一个对象吗?
    • 所以答案是肯定的,当对象 A 和对象 B 和对象 C 各自创建对象 X 的一个实例时。但是在查看它们的内存位置时,对象 X 的这个实例永远不会相同。
    • 谢谢。如果您也可以考虑stackoverflow.com/questions/56479898/… 和stackoverflow.com/questions/56478884/…,我将不胜感激
    • 实例化创建一个对象实例,而聚合描述对象之间的关系(已经创建或实例化)
    • "当对象 A 实例化/聚合/熟悉对象 B 时,对象 A 是否必须具有引用对象 B 的字段成员?"是的
    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    相关资源
    最近更新 更多