Как показать отношения Singleton в диаграмме классов

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

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

Ответ 1

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

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

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

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

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

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

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

Состав немного, если только содержащийся класс также является одиночным.

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

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

enter image description here

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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