# Erzeuger Muster (Builder)



## byte (18. Mai 2006)

Hallo,

ich schreibe derzeit eine Anwendung, der eine ziemlich komplexe Datenstruktur - bestehend aus etwa 40 Klassen - zugrunde liegt. Die Daten werden über eine XML-Datei eingelesen. Daraus wird dann die interne Objektstruktur erzeugt.

Zur Erzeugung der internen Datenstruktur möchte ich das Erzeuger Muster einsetzen. Die Planung sieht folgendermaßen aus. Ein IOManager kümmert sich um den Ablauf des Ladens bzw. Speicherns der Dateien. Zunächst holt er sich per FileDialog (SWT Pendant zum JFileChooser) die Datei. Er delegiert das Laden der XML-Datei an ein Director-Object, welches die XML-Datei einliest (per JDOM) und dann die build() Aufrufe an den Builder schickt. Am Ende holt sich der IOManager das "Endprodukt" beim Builder ab.

So weit so gut. Ich habe mir nun aber überlegt, dass ich aufgrund der Größe meiner Datenstruktur nicht nur einen sondern zwei Builder schreiben will, da sich die Datenstruktur auch inhaltlich gut in zwei verschiedene Teile gliedern lässt. Weiterhin war die Idee, die Konstruktoren der einzelnen Klassen dann package-private zu machen, um sicherzustellen, dass nur die Builder sich um die Objektinstanzierung kümmern. Nun habe ich aber die Klassen der Datenstruktur in verschiedene Packages aufgeteilt. Ich müsste für package-private Konstruktoren aber alle relevanten Klassen im selben Package haben, wie der relevante Builder.

Nun habe ich also zwei Möglichkeiten. Entweder ich schmeisse alle Klassen zusammen mit dem Builder in ein Package. Dann habe ich aber wieder ein Problem, denn es gibt Klassen, die sowohl von Builder1 als auch von Builder2 instanziert werden müssen. Also müsste ich im Endeffekt alles in ein Package schmeissen. Dann könnte ich die Konstruktoren package-private machen, hätte aber ein riesiges unübersichtliches Package. Oder ich lasse es wie es ist und die Konstruktoren bleiben public.

Wie würdet Ihr das handhaben?

MFG byto


Edit: Ich meinte natürlich package-private, nicht protected...


----------



## SamHotte (18. Mai 2006)

Wie wäre es, die Packagestruktur zu lassen, die Konstruktoren package-private zu machen und über eine Fassadenklasse, die public-Methoden anbietet, zuzugreifen?


----------



## byte (18. Mai 2006)

Sorry, ich hatte mich verschrieben. Ich meinte natürlich nicht protected sondern package-private. Ich habe halt noch das Problem, dass die Klassen für einen der Builder auf mehrere Packages verstreut sind. Da kann ich also die Konstruktoren nicht package-private machen, ausser ich mache alle Klassen in ein Package.

Naja, im Endeffekt ist es vielleicht auch völlig wurscht. Ich schreibe ja kein Framework, von daher ist es ja quasi egal, ob die Konstruktoren nun package-private oder public sind. Hauptsache, ich habe meine Instanzierung der Datenstruktur schön gekapselt auf Builder und den Director. :roll:


----------

