如何在类图中显示单例关系

ahj*_*ahj 12 c++ singleton uml class-diagram

如果一个类包含指向单例类的指针,它可以aggregation吗?

据我所知,它不能成为一种has-a关系,因为类不会创建单例类的实例,它只是像association关系一样使用它.

Uff*_*ffe 12

标题并没有像书面那样100%完整.有单例类,但没有真正的单例关系.任何关系都可以在任何一端分配多重性,所以如果你的意思是一对一的关系,你所做的就是在两端分配多重性1.

类也可以有多重性.你经常看不到这种情况,除了一个案例:单身人士.

当涉及A有或包含或引用B时,UML基本上有三个紧密程度.

聚合(未填充的菱形箭头)意味着包含不是独占的,并且包含的​​对象不与包含对象共享其生命周期的任何方面.在实现中,这通常是指针.

组合(填充的菱形箭头)表示包含的对象在包含对象时被破坏.让这个工作通常意味着收容是独家的.在实现中,这通常是一个指针,其析构函数在包含类的析构函数中被调用(尽管它可能不在包含类的构造函数中创建).

定向关联或成员属性(UML中的相同内容)意味着包含的对象是包含对象的状态的一部分,或者如果愿意,则是组成部分.在实现中,这通常意味着引用不是指针,或者是否包含的对象与包含对象共同创建和销毁.

单身的聚合是完全允许的(甚至来自几个不同的类),因为根据定义聚合是非排他性的.

除非包含类也是单例,否则组合有点不确定.

属性/定向关联很可能是错误的.如果包含类是一个单例,那么将包含的类作为单例也没有任何意义,因为这是隐含的.如果包含的类在两个不同的类中用作成员,则它不能是单例.

除了上述内容之外,您当然还可以根据需要添加尽可能多的使用关系.这在所有设计中都很常见,并且暗示关系源端的类调用目标端的类中的方法.

在此输入图像描述


Mik*_*e G 5

我想说,从技术上讲,是的,你可以有一个成员变量,它是指向单例对象的指针,并将其称为聚合;不过,一旦编写了代码,使用聚合术语就没有多大意义了。出于所有意图和目的,它只是一个协会。

然而,在图表中使用聚合关联可能会也可能不会帮助图表的查看者理解它。这可能取决于您要向谁展示它以及他们可能理解聚合的含义。

要实际回答标题中的问题(使用《UML 用户指南》(第二版)中的信息):

______________________          ______________________
|                    |          |                   1|
|  AggregatingClass  |          |   SingletonClass   |
|____________________|      0..1|____________________|
|                    |<>--------|                    |
|____________________|          |____________________|
|                    |          |                    |
|____________________|          |____________________|
Run Code Online (Sandbox Code Playgroud)

(请注意1单例类框右上角的 表示基数。)