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

时间:2012-02-29 11:09:45

标签: c++ singleton uml class-diagram

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

根据我的理解,它不能是has-a关系,因为类不会创建单例类的实例,它只是像association关系一样使用它。

4 个答案:

答案 0 :(得分:11)

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

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

对于拥有或包含或引用B的A,UML基本上有三个紧密程度。

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

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

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

单例的聚合是完全允许的(即使是来自几个不同的类),因为根据定义聚合是非排他性的。

组合有点不合理,除非包含的类也是单例。

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

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

enter image description here

答案 1 :(得分:4)

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

然而,在图中使用聚合关联可能会或可能不会帮助图的查看者理解它。这可能取决于你要向谁显示它以及他们可能理解聚合意味着什么。

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

______________________          ______________________
|                    |          |                   1|
|  AggregatingClass  |          |   SingletonClass   |
|____________________|      0..1|____________________|
|                    |<>--------|                    |
|____________________|          |____________________|
|                    |          |                    |
|____________________|          |____________________|

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

答案 2 :(得分:1)

还有一个带有空心方块而不是填充方的聚合。 open表示第一个实例不会生成另一个实例(但仍然具有has-a关系)。

答案 3 :(得分:1)

你可以假装它是聚合,但事实是:单身人士与面向对象的代码无关。它们是全局状态的一种形式(就像全局变量一样)。

您可能需要考虑采用不同的方法解决问题。

P.S一些可能有用的材料: