M. E ist eine Komposition strenger als eine Aggregation. Es soll niemals ein Objekt losgelöst von einer Beziehungsinstanz erstellt werden können. Der Klassiker ist der Raum als Bestandteil eines Gebäudes welcher niemals ohne ein Gebäude entstehen darf. Wenn ich also nun die Klasse "Raum" und die Klasse "Gebäude" habe, wie verhindere ich, dass von der Klasse Raum einfach mal ebenso ein Objekt angelegt wird? Auf der einen Seite muss ich doch den Konstruktur für die Klasse Raum anbieten weil ich in der Klasse Gebäude die Beziehung "hat ein" herstellen möchte, nämlich im Konstruktur von Gebäude, aber auf der anderen Seite möchte ich nicht, dass ein Objekt der Klasse Raum außerhalb der Klasse Gebäude angelegt werden darf. Wie macht man das?
Komposition ist hauptsächlich eine logische Beziehung, im Code ist es meist nicht von einer einfachen Assoziation unterscheidbar.
Man kann es versuchen sicherzustellen, dass jedes "Kind" nur zu einem "Elter" gehört.
In dem Fall zB, in dem Raum das Gebäude und Gebäude die Räume kennt.
Das bringt dann aber schnell wieder Probleme mit sich, bidirektionale Beziehungen sind zB generell schwierig und man kann es trotzdem umgehen.
Außerdem kann man die Sichtbarkeit der Klassen passend einschränken. zB kann "Raum" eine innere Klasse von "Gebäude" sein, dann kann nur ein Gebäude die Räume erzeugen. Oder das erzeugen über Factorys einschränken, die einen Raum erst erzeugen, wenn ein Gebäude gegeben ist.
Eine Lösung, die für alle Fälle passt, gibt es dabei aber nicht wirklich, oft muss man dass auch gar nicht innerhalb der beteiligten Klassen sicher stellen, sondern der Code drum herum stellt das sicher.