Fakt ist, daß beim Übergeben von Referenzen keine neuen Ressourcen angelegt werden. Was Deine Befürchtungen hinsichtlich Effizienz betrifft, das kann auch im Entwurfmuster selbst begründet sein. Natürlich ist es unnötig, haufenweise Objekte zu erzeugen und Code zu kompilieren wo für eine spezielle Aufgabe nur ein Bruchteil davon gebraucht wird, das scheint der Nachteil dieses Entwurfsmusters zu sein.
In Deinem Code finden sich übrigens weitere Entwurfsmuster, z.B. Aggregation und Delegation auch bekannt als Dependency Injection was in der Praxis auch völlig normal ist, also daß mehrere Entwurfmuster nebeneinander verbaut werden.
Also schau Dir mal die Factory an. Und auch wie man Code durch Teilung effizienter macht und infolge Auslagerung von Code Redundanzen vermeidet.
MFG