« 5304 | Main| Telescoping Constructor »

Static Factory Method

8
Kategorie  
Was will er jetzt schon wieder die meisten Factory Methoden werden doch static implementiert, zumindest meistens

Wikipedia spukt diese Beschreibung aus ->

„Static Factory Method“: Einzelne static-Methode, die ein Objekt eines Typs oder Unter-Typs zurückliefert. Kein „virtual constructor“ - Sinn der Sache: Zentraler, klassenbasierter Access Point für Objekterzeugung analog zu new. Erfordert manchmal Einführung einer einzelnen Klasse nur als „Factory Method Holder“. Beispiele:
  • Java: java.util.Collections.singletonMap()
  • Java: javax.xml.parsers.DocumentBuilderFactory.newInstance()

das ist nicht, dass worüber ich eigentlich heute schreiben möchte ....
Meistens fängt es ja so an..... man will sich eine Klasse bauen...... ich nehme einfach mal eine Zahlen-Menge. Die Klasse soll den Namen haben MyIntSet

also ungefähr so
public class MyIntSet{
   public MyIntSet();
   public void add(int x);
}

bis auf Kleinigkeiten, korrekt
Jetzt überlegt man sich, es wäre ja cool einen Konstruktur zu haben, bei dem man gleich einen ganzen Bereich angeben kann, von Zahlen, welche dann in der Menge sind, so von 1..5....
Also wird man einen weiteren Konstruktor bauen....
public MyIntSet(int min, int max);

Dann überlegt man sich, dass man evtl. alle durch 2 teilbaren, oder 3 teilbaren Zahlen in einem Gewissen Bereichen haben möchte....
Also weiteren Konstruktor
public MyIntSet(int min, int max, int factor);

Am Ende des Tages hat man dann 35.000 Konstruktoren, welche sich in der Signatur unterscheiden müssen!

Einfacher geht es erst gar keinen public Konstruktor zur Verfügung zustellen, sondern nur static factory methods, in diesem Beispiel
public static MyIntSet CreateRangeSet(int min, int max)
public static MyIntSet CreateRangeSetByFactor(int min, int max, int factor);

weiters kann man jetzt neue "Konstruktoren" mit der gleichen Signatur erstellen, z.B.:
public static MyIntSet CreateRageSetPrime(int min, int max)
und anhand des Namens, kann man leicht erkennen, dass hier eine Menge mit den Primzahlen zwischen Min und Max erstellt wird.

Vorteile der static factory methods:
* Die Methoden haben Namen und es können "gleiche Signaturen" benutzt werden
* Die Methoden müssen nicht unbedingt ein "neues" Objekt erzeugen
* Die Methoden können abgeleitete Klassen zurückgeben!
* Die Methoden können bei parametrisierten Typen, den Schreibaufwand reduzieren

Also Happy "Static Factory Methods" !!!!

Nein, so schnell nicht, denn es gibt auch Nachteile
* z.B. in Java kann von Klassen, welche keinen public oder protected Konstruktor haben nicht abgeleitet werden
* man kann die "static factory methods" nicht wirklich von anderen statischen Methoden unterscheiden

So dann viel Spaß, schönes Wochenende, gutes neues Jahr.....

und wenn mal wieder ein Architekt vorbeikommt, dann kann man ja erst mal eine Diskussion über die Verwendung von "static factory methods" vom Zaume brechen

Gruß JJR


Kommentare

Gravatar Image1 - Guten Abend Jörg,

wenn man gleich ein richtiges Factory-Pattern anwendet sollten die beiden Nachteile (zumindestens der zweite) weg sein.
Wenn ich es richtig verstanden habe, sind die normalen "static factory methods" dem entgegen direkt in der betreffenden Klasse(?)... hmm, da hätte ich etwas Bauchschmerzen was die spätere Umarbeitung (neudeutsch: Refactoring Emoticon) des Codes angeht. Factory könnte z.B. später mit vertretbarem Aufwand zur Abstract-Factory aufgebohrt werden, hab ich selbst schonmal benötigt.

Grüße,
Sebastian

Gravatar Image2 - Hallo Sebastian,

stimme zu, dass man gleich ein Factory-Pattern implementieren könnte. Hat aber aus meiner Sicht, den Nachteil, dass man ein Interface extrahiert und pflegen muß, welches evtl. nie von einer weiteren Klasse implementiert wird. Falls es doch zu einer weiteren Implementierung kommt, kann man das Interface schnell extrahieren und die Factory-Methoden sind ja auch schon bekannt, also sollte sich der Refactoring-Aufwand in Grenzen halten. Wenn man nach dem Motto handelt, "Starte einfach, kompliziert wird es von allein!", dann sollte es ein guter Ansatz sein Emoticon

Gruß JJR
P.S.: agile nor not agile, wie schon Shakespeare anmerkte Emoticon

Gravatar Image3 - Hallo Jörg,

ja ein Interface benötigt man dann auf jeden Fall - korrekto Emoticon

Dabei fällt mir ein, dass ich neulich mal zu einem C#-Architekturvortrag war, wo jemand das "Contract-First" Vorgehen erklärt und auch heftig angepriesen hat... als ich anmerkte, dass ein Interface pro Klasse evt. überflüssiger Müll sei exakt wegen dem von dir besagtem Pflegeaufwand ohne Nachnutzung durch weitere Klassen... war ich irgendwie unbeliebt bei dem Vortragenden Emoticon

Grüße,
Sebastian

Gravatar Image4 - Hallo Sebastian,

wahrscheinlich war es ein LOA siehe { Link }
Vielleicht sollte ich noch die Anmerkung einbauen: keine Klasse ohne Interface Emoticon

Gruß JJR

Mach einen Kommentar

:-D:-o:-p:-x:-(:-):-\:angry::cool::cry::emb::grin::huh::laugh::lips::rolleyes:;-)

Amazon


Impressum

Firmenname: Peanuts-Soft
Straße Nummer: Biinger Strasse 8
PLZ Ort: 55263 Wackernheim
Telefon: +491772134526
E-Mail: joerg.reck @ peanuts-soft.de
Disclaimer: Peanuts-Soft übernimmt keine Garantie dafür, dass die auf dieser Website bereitgestellten Informationen vollständig, richtig und stets aktuell sind. Dies gilt auch für alle Links, auf die verwiesen wird. Peanuts-Soft ist für die Inhalte, auf die per Link verwiesen wird, nicht verantwortlich. Peanuts-Soft haftet nicht für konkrete, mittelbare und unmittelbare Schäden oder Schäden, die durch fehlende Nutzungsmöglichkeiten, Datenverluste oder entgangene Gewinne – sei es aufgrund der Nichteinhaltung vertraglicher Verpflichtungen, durch Fahrlässigkeit oder eine andere unerlaubte Handlung – im Zusammenhang mit der Nutzung von Dokumenten oder Informationen bzw. der Erbringung von Dienstleistungen entstehen, die auf dieser Web Site zugänglich sind.
Datenschutz: Inhalt und Gestaltung der Internetseiten sind urheberrechtlich geschützt. Eine Vervielfältigung der Seiten oder deren Inhalte bedarf der vorherigen schriftlichen Zustimmung von Peanuts-Soft.


Locations of visitors to this page

Powered By

Domino BlogSphere
Version 3.0.2