我想知道是否有一种方法可以在UML(类或其他图)中建模哪个类(或者函数)负责创建另一个特定对象?
另外,我想知道如何在类图中指定谁拥有一个对象。我的第一个猜测是使用合成。但是,我在stackoverflow上看到一个讨论说墙可以是房间的组合,但是椅子宁可被建模为聚合。但在这种情况下,哪个班级负责破坏主席?我宁愿椅子是房间的一个组成部分,房间负责管理椅子,虽然房间可以在没有椅子的情况下生存。 谢谢
答案 0 :(得分:2)
正如您已经提到的,可能有一些对象的所有者或创建者。因此,有几种方法可以在U.M.L中记录此功能。
请记住,当开发人员为类,类图或序列图建模时,他/她的确意味着(一个对象):"当我创建这个类的实例时......&#34 ;
因为,您的问题也适用于静态或类成员。
(1),可以有属于对象的属性或字段的对象,由类图表示:
......................................................
..+-------------------+........+-------------------+..
..| <<class>> |........| <<class>> |..
..| CarClass |........| MotorClass |..
..+-------------------+........+-------------------+..
..|[+] Motor |<*>-----| ... |..
..+-------------------+........+-------------------+..
......................................................
子对象由同一个类的函数创建,可能是构造函数或其他函数,但属性指示主对象负责或分配或取消分配子对象。在类图中,这种关系由组合关联表示,这两个类之间有一条线,带有填充的菱形。
(2)有时所有权流程被拆分,子对象在某处创建, 在另一个地方使用,并以另一种方式销毁。
通常,函数,全局或类的一部分,创建并返回一个对象。这有时称为所有权转移。
这个结果存储在其他地方,并且不是显式的,谁会破坏该对象,但是,它所做的创建会被记录下来。
...........................................................................
..+----------------------------------------+........+-------------------+..
..| <<class>> |........| <<class>> |..
..| MotorFactoryClass |........| MotorClass |..
..+----------------------------------------+........+-------------------+..
..|[+] CreateMotor(): MotorClass |------->| ... |..
..|[+] DestroyMotor(ref MotorClass AMotor) |------->| ... |..
..+----------------------------------------+........+-------------------+..
...........................................................................
这称为 Realization Association ,专门用于对象所有权的一半。它被建模为创建子对象的方法之间的箭头, 和子对象的类。线条点缀。
创建对象的主类,称为工厂。
当一个对象被另一个类破坏时,会发生类似的情况。
(3)当另一个方法或另一个对象(类)使用它创建的对象时,进程的另一半发生。
有时,即使主要对象可能不负责删除子对象,它所应用的对象也被分配给主对象的属性或字段。
......................................................
..+-------------------+........+-------------------+..
..| <<class>> |........| <<class>> |..
..| CarClass |........| MotorClass |..
..+-------------------+........+-------------------+..
..|[+] Motor |< >-----| ... |..
..+-------------------+........+-------------------+..
......................................................
这称为聚合关联,它类似于组合关联,但未填充菱形。主要对象,它被认为, 即使是对象的时间所有者,如果它没有改变它的创造或破坏。
使用(2)和(3)的图表和操作,互补。
(4)对于全局函数或变量,建模非常相似。
通常,主程序或库可以类似于类使用。
......................................................
..+-------------------+........+-------------------+..
..| <<module>> |........| <<class>> |..
..| Program |........| ConsoleClass |..
..+-------------------+........+-------------------+..
..|[+] Console |<*>-----|[+] scan(): void |..
..|[+] main: void |........|[+] print(): void |..
..+-------------------+........| ... |..
...............................+-------------------+..
......................................................
注意:C#/ Java 控制台,它是全局对象的一个很好的例子。
只需2美分。
答案 1 :(得分:0)
您可以将对象矩形添加到类图中,以举例说明类的对象。在对象矩形的第一个隔离专区中,指定对象的ID及其用冒号分隔的类型/类。
当你说“谁拥有一个对象”时,你可能会引用对象的类型/类与“拥有”该类型对象的其他类之间的生命周期依赖关系。 UML没有定义如何在类图中表达这种生命周期依赖关系的任何标准方法。它们可以以用户定义(构造型)依赖性箭头或约束框的形式添加。
答案 2 :(得分:0)
类和对象实际上是非常不同类型的野兽,混合它们通常不是一个好主意:类在源代码中找到并存在直到编译时,而对象是运行时实体。换句话说,类不拥有对象 - 对象具有。 还应该记住,UML轻率地忽略了编程中涉及的大多数现实问题,因此大多数此类概念都没有标准化的连接器。
聚合和组合都是(合理)定义明确的结构关系。如果你想说的是A类负责创建B类实例,而C类负责删除它们,我会使用命名的有向关联。
另一方面,如果您想跟踪特定对象从创建到删除的跟踪,那么最好在序列图中完成。