Как показать отношение Singleton в диаграмме классов - PullRequest
11 голосов
/ 29 февраля 2012

Если класс содержит указатель на одноэлементный класс, может ли он быть aggregation?

Насколько я понимаю, это не может быть отношение has-a, поскольку класс не создает экземпляр класса singleton, он просто использует его как отношение association.

Ответы [ 4 ]

11 голосов
/ 06 марта 2012

Название не имеет 100% полного смысла, как написано. Есть одноэлементные классы, но в действительности нет одноэлементных отношений. Любым отношениям можно назначить множественность на любом конце, поэтому, если вы имеете в виду отношения один к одному, все, что вам нужно сделать, это назначить множественность 1 на обоих концах.

Классы также могут иметь кратности. Вы не часто используете это, за исключением одного случая: синглтоны.

Когда речь идет о A, имеющем или содержащем или ссылающемся на B, в UML существует в основном три уровня плотности.

Агрегация (незаполненный ромбовидный наконечник стрелки) подразумевает, что содержание не является исключительным и что содержащийся объект не разделяет какой-либо аспект своего жизненного цикла с содержащим объектом. В реализации это обычно указатель.

Композиция (заполненный ромбовидный наконечник стрелки) подразумевает, что содержащийся объект разрушается, когда содержащийся объект разрушает. Получение этого к работе обычно означает, что сдерживание является исключительным. В реализации это часто указатель, деструктор которого вызывается в деструкторе содержащего класса (хотя он не может быть создан в конструкторе содержащего класса).

Направленный атрибут ассоциации или члена (то же самое в UML) подразумевает, что содержащийся объект является частью состояния или, если хотите, составной частью содержащего объекта. В реализации это обычно означает, что ссылка не является указателем или если содержащийся объект создан и уничтожен вместе с содержащим объектом.

Агрегирование синглтона совершенно допустимо (даже из нескольких разных классов), потому что агрегация по определению неисключительна.

Композиция немного ненадежна, если только содержащий ее класс также не является синглтоном.

Атрибут / направленная связь, скорее всего, неверна. Если содержащий класс является синглтоном, не имеет смысла делать содержащийся класс также синглтоном, поскольку это подразумевается. И если содержащийся класс используется в качестве члена в двух разных классах, он не может быть одиночным.

В дополнение к вышесказанному, вы также можете добавить столько отношений использования, сколько пожелаете. Это распространено во всех разработках и подразумевает, что класс в конце источника вызывает методы в классе в конце назначения.

enter image description here

4 голосов
/ 01 марта 2012

Я бы сказал, технически, да, вы можете иметь переменную-член, которая является указателем на одноэлементный объект, и называть его агрегацией; Использование термина агрегации не имеет большого значения, когда вы пишете код. По сути, это просто ассоциация.

Однако использование ассоциации агрегации в диаграмме может или не может помочь зрителю диаграммы понять его. Это, вероятно, зависит от того, кому вы собираетесь это показывать, и что они могут понимать под совокупностью.

Чтобы действительно ответить на вопрос в заголовке (используя информацию из Руководства пользователя UML (2-е издание):

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

(Обратите внимание на 1 в верхнем правом углу поля класса синглтона, указывающего количество элементов.)

1 голос
/ 29 февраля 2012

Вы можете притвориться, что это агрегация , но правда в том, что синглтоны не имеют ничего общего с объектно-ориентированным кодом. Они являются формой глобального состояния (как и глобальные переменные).

Возможно, вы захотите рассмотреть другой подход к проблеме.

P.S некоторые материалы, которые могут помочь:

1 голос
/ 29 февраля 2012

Существует также агрегат с открытым квадратом вместо заполненного. Открытие означает, что первый экземпляр не создает другой (но все еще имеет отношение has-a).

...