Ich schlage 2 Fliegen mit einer Klappe:
- Pro DAOFactory habe ich nur eine Spring-Bean (je weniger XML-Konfiguration, desto besser, Stichwort Medienbruch)
- Die DAOs sind Methoden-lokal UND ich muss keine setter deklarieren (SETTER INJECTION) UND ich brauche keinen speziellen Konstruktor (CONSTRUCTOR INJECTION) UND ich brauche keine speziellen Parameter (PARAMETER INJECTION)
Ich habe etwas weniger Granularität, weil ich DAOs einer Factory gemeinsam betrachte, aber das ist auch in dem Sinne der abstrakten Fabrik.
Naja, man könnte Di auch per Annotation nutzen -> keine Setter, keine Parameter, aber keine einfache Möglichkeit in tests mockobjects zu injecten.
Persönlich finde ich Setter in Implementierungen nicht so schlimm.
Deine tests werdden aber klomplizierter weil du DI und ResourceLookup kombinierst, du musst ejtzt auch deine abstrakte Fabrik konfigurieren, das müsstest du nciht ohne resourceLookup.
Wie gesagt, DI und Resourcelookup leisten in etwa ähnliches, wobei resourcelookup mehr Nachteile hat.
Ich sage, es soll sich wie ein PersistentObject verhalten, mehr nicht, Stichwort Polymorphie. Die Abbildung auf eine DB-Tabelle ist transparent für jeden Aufrufer.
Denke du würdest eigentlich einen sog. DomainService brauchen, mehr dazu später.
Die Aufrufe sind so lokal wie möglich (Stichwort Sichtbarkeit) , denn nur die Methode kennt die DAOs, die sie selber benötigt. Des Weiteren ist die Kopplung lose, weil PMSystemDAO und ProjectDAO Interfaces sind. Ach ja: DAOFabrik ist auch ein Interface. SingletonDAOFabrik ist eine Hilfsklasse, die selber keine DAOFabrik ist, sondern sich eine Singleton-DAOFabrik holt. Die Inderektion ist der losen Kopplung geschuldet.
Kohäsion vs. Lose Kopplung.
Die zus. indirektion kannst du dir imho sparen, hast dann sogar eine noch losere Kopplung.
Ich bin mir im Moment nicht sicher, ob wir dasselbe unter Objekt, Entität, Value Object oder DTO verstehen.
Tatsache ist: Fachlich soll der Name eindeutig sein. Technisch kriegt das Objekt natürlich irgendeine DB-Id verpasst.
Ein DTO ist es definitiv nicht. Ein ValueObject ist aus meiner Sicht nur ein DatenContainer, der wenig bis keine interne Logik hat und das Prinzip der Kapselung minimiert. Eine Entität ist irgendetwas, was eine Identität und einen Typ hat. und ein Objekt ist für mich eine Entität mit Logik, welche das Prinzip der Kapselung maximiert. Ich spreche wahrscheinlich von Objekten.
Respository, DTO, ValueObject, Entity, DomainService etc. pp. sind allesamt Begriffe, die von Domain Driven Design definiert (bzw. umdefiniert wie bei Entity) wurden.
Das Problem: Die Sun Jungs haben "ValueObject" nochmal redefiniert, bis heute immer noch eine Quelle für Missverständnisse.
Das wurde schon vor Jahren korrigiert, in Sun Dokumenten heisst das jetzt auch DTO, ein ValueObjects ist etwas anderes (am besten Mutable, wird durch den Werrt, nicht durch eine ID identifiziert).
In dem Link oben zur J2EE Architektur wird ValueObject noch falsch verwendet...
Persönlich denke ich dass du auch dem richigen Weg bist OO Systeme zu entwicklen, denn die von Sun vorgeschlagene Architektur ist eher prozedural:
- dumme Datenstrukturen ohne Logik wie JavaBeans anstatt echter Objekte,also eine Trennung von Daten und Logik
- die Logik findet sich in Sessionbeans, Martin Fowler nennt das Transaction Script
-die Businesstier stellt per SessionBeans Operationen zur Verfügung welche von der GUI in der richtigen Reihenfolge aufgerufen werden müssen, Evans nennt das GUI driven).
Ich kann dir nur sehr empfehlen, Eric Evans buch über Domain Driven Design zu lesen, geht in genau die Richtung in die du möchtest, ist das Standardwerk zu DDD und definiert Dinge wie DTO, ValueObject eindeutig.
zB. hättest du dann kein DAO, sondern ein Repository, Repos werden von Domain Objekten (Entities, DomainServices, etc. pp.) verwendet, wie DAOs, aber letztere werden laut Sun nur von SessionBeans genutzt

Zur Erzeugung von komplexen Objekten wie Entites (manchmal auch ValueObjects) werden explizite Factories genutzt, zum finden/ändern/persistieren eben Repositories.
Entites sind nicht immutable (wäre sehr unsprakisch beim ändern & specihern), sind aber aus immutable ValueObjects zusammengesetzt und haben selber nicht so viele mutable "Anteile".
Da gibt es noch viel mehr und ich denke dass du es nicht bereuen wirst es zu lesen.
Stark vereinfacht könnte man sagen, dass die "architektonische Welt" (wenn man das so nenne mag) ist in Java in zwei Kontinente geteilt ist:
Suns Empfehlungen und Domain Driven Design.
Wenn du DDD praktizierst (und IMHO tust du das bzw. gehst sehr in diese Richtung), solltest du am besten auch die DDD Terminlogie verwenden, sonst wird es immer einen Aufschrei derer geben, die Suns Empfehlungen folgen, denn da ist es eine Todsünde einer Entity ein DAO mitzugeben und verwenden zu lassen.
In DDD dagegen ist es die absolute Norm, Entites Repositories und Factories mitzugeben, so dass sie selber andere Entites/ValueObjects suchen, erstelllen, ändern und speichern können.
Ach ja, fast vergessen:
Um die Verwirrung komplett zu machen, hat irgend ein Marketing Hans-Wurst mal den Begriff DDD umdefiniert bzw. das versucht, gemeint sind Entites, die statische Methoden zum suchen, speichern bieten.
Das heisst eigentlich "Active Record" bei Fowler und hat nix mit DDD zu tun.
Zu guter letzt:
DDD ist nicht immer angebracht bzw. das beste Mittel, genausowenig wie Suns Empfehlungen/Prozedural immer die beste Lösung darstellt.
Man sollte beides kennen, unterscheiden und anwenden können
Der Lock reichert die Methode um Multi-User-Behandlung an. Die Asymmetrie ist zweifelsfrei gegeben. Aktuell sehe ich aber keine andere Möglichkeit, weil ich nicht weiss, woher Fachmethoden später überall her aufgerufen werden und der Aufrufer die Methode in seinem ganz eigenen größeren transaktionalen Kontext aufrufen möchte. Deshalb erfolgt der De-Lock immer am Ende der Transaktion implizit und nicht explizit.
Dasselbe problem hat man auch mit Transaktionen, wenn du das auch deklerativ zB. per Annotation lösen könntest waäre das Ideal, ist aber nicht wirklich so schlimm.