Агрегация
Различают физическое включение (по значению) и включение по ссылке (указателю). При использовании ссылок объекты живут отдельно друг от друга: мы можем создавать и уничтожать экземпляры классов независимо. Чтобы избежать структурной зависимости через ссылки важно придерживаться какой-то договоренности относительно создания и уничтожения объектов, ссылки на которые могут содержаться в разных местах. Нужно, чтобы это делал кто-то один.
Агрегация является направленной, как и всякое отношение "целое/часть". Физическое вхождение одного в другое нельзя "зациклить", а вот указатели – можно (каждый из двух объектов может содержать указатель на другой).
Агрегация не требует обязательного физического включения, ни по значению, ни по ссылке. Например, акционер владеет акциями, но они не являются его физической частью. Более того, время жизни этих объектов может быть совершенно различным, хотя концептуально отношение целого и части сохраняется и каждая акция входит в имущество своего акционера. Поэтому агрегация может быть очень косвенной. "Лакмусовая бумажка" для выявления агрегации такова: если (и только если) налицо отношение "целое/часть" между объектами, их классы должны находиться в отношении агрегации друг с другом.
Часто агрегацию путают с множественным наследованием. Действительно, в C++ скрытое (защищенное или закрытое) наследование почти всегда можно заменить скрытой агрегацией экземпляра суперкласса. Решая, с чем вы имеете дело – с наследованием или агрегацией – будьте осторожны. Если вы не уверены, что налицо отношение общего и частного (is а), вместо наследования лучше применить агрегацию или что-нибудь ещё.
Для физического включения часто используют термин композиция (объединение). Некоторые авторы разницу между видами агрегации проводят по времени жизни объектов, то есть физическое включение означает, что время жизни составных частей совпадает с временем жизни составного объекта, так как многие современные языки программирования (C#, Java) не поддерживают включение по значению.