# Singelton Fabriken - Wohin mit getInstance?



## guni (30. Mrz 2009)

hallo leute,
ich habe mehrere Klassen, die nach dem Fabrikmuster aufgebaut sind (eine create-Methode).
Sie alle erben von einer abstrakten Klasse AbstractCreator.
Gleichzeitig macht es ja Sinn, eine Fabrik als Singleton zu entwerfen (kein Konstruktor, eine statische getInstance-Methode),da sie ja nicht mehrfach initialisiert werden muss ...
ich habe also folgenden Code:
[highlight=Java] 
public abstract class AbstractCreator {
public void create(){
// hier steht mein allgemeiner Code
concreteCreation();
}
protected abstract void concreteCreation();
}
[/highlight]
[highlight=Java] 
public class FolderCreator {
@Override
protected void concreteCreation() {
// hier steht mein konkreter Code
}
}
[/highlight]
[highlight=Java] 
public class FileCreator {
@Override
protected void concreteCreation() {
// hier steht mein konkreter Code
}
}
[/highlight]
meine Frage ist: wohin mit den Singleton-Methoden? 
da meine AbstractCreator ja abstrakt ist, kann ich hier keine getInstance schreiben!
auf der anderen Seite kann ich ja bei 20 verschiedenen konkreten Fabriken nicht überall die gleiche getInstance reinkopieren, oder? das wäre doch auch nicht schön!

lg, guni


----------



## SlaterB (30. Mrz 2009)

von den meisten wirst du gleich hören, dass du gar kein Singleton benutzen sollst  ,
oder siehe Forumsuche (oder schon bekannt bei 230 Postings, dann mutige Frage  )

neutral geantwortet:
statische Methoden kann man nicht vererben, die musst du jeweils einzeln deklarieren,

auch mit nur einer Klasse, welche auf die anderen verweist, ob statisch oder nicht, wirst du nicht wesentlich vorankommen,
für jede Factory brauchst du einen unterschiedlichen Rückgabewert, also sowieso unterschiedliche Methoden


----------



## Ebenius (30. Mrz 2009)

guni hat gesagt.:


> Gleichzeitig macht es ja Sinn, eine Fabrik als Singleton zu entwerfen (kein Konstruktor, eine statische getInstance-Methode),da sie ja nicht mehrfach initialisiert werden muss ...


Eine gewagte These, siehe [thread=80674]Singletons sind ...[/thread].

// EDIT: Zu langsam 

Ebenius


----------



## guni (30. Mrz 2009)

... ok. habe bei dieser Diskussion auch mal meine Meinung geposted.
Im Übrigen habe ich mich auf Empfehlung des Buches "Effektiv Java programmieren" von Joshua Bloch für Singletons entschieden. (Thema 2: Erzwingen Sie mit einem privaten Konstruktor die Singleton-Eigenschaft)


----------



## Ebenius (30. Mrz 2009)

Die zugrunde liegende Frage ist: Bin ich mir sicher, dass in diesem Kontext und jedem in absehbarer Zukunft daraus erwachsenden Kontext die Klasse tatsächlich nur eine Instanz haben soll. Wenn dem so ist, ist Singleton okay. Die Frage selbst eben oft schwer zu beantworten.

Was spricht denn dagegen, die Instanz des Creators zu erzeugen wenn man sie benötigt und zu vergessen wenn man sie nicht mehr braucht?

Ebenius


----------



## Spacerat (30. Mrz 2009)

Kann ja sein, das das auch noch irgendwo anders steht und du es bereits in deinem Buch gelesen hast...
Laut Guido Krüger (www.javabuch.de - Das Handbuch der Java-Programmierung) jedenfalls, sind "Factory" und "Singleton" zwei unterschiedliche Design-Patterns bzw. Entwurfsmuster.
Singleton: Wirklich nur eine Instanz der Klasse.
Factory: ein oder mehrere Instanzen einer speziellen Implementation einer Klasse.


----------



## guni (30. Mrz 2009)

@Ebenius: Wieso sollte ich von einer Factory (die ja nichts anderes macht als Objekte zu erzeugen) jemals mehr als eine Instanz brauchen?

@Spacerat: ich hab ja nie behauptet, dass Factory und Singleton ein und dasselbe sind. Alles was ich wollte ist eine Kombination dieser beiden Patterns und ein Versuch, meine getInstance nur einmal schreiben zu müssen ...

lg


----------



## Ebenius (30. Mrz 2009)

guni hat gesagt.:


> @Ebenius: Wieso sollte ich von einer Factory (die ja nichts anderes macht als Objekte zu erzeugen) jemals mehr als eine Instanz brauchen?


Eventuell weil Du auf verschiedene Arten Objekte bauen können willst. Es gibt oft abstrakte Fabriken, zum Beispiel TransformerFactory. Man weiß vielleicht nicht von vorn herein, dass man später Fabriken unterschiedlich initialisieren wollen wird, um unterschiedlich erzeugte Objekte bauen zu können.

Ebenius


----------



## foobar (30. Mrz 2009)

Spacerat hat gesagt.:


> Kann ja sein, das das auch noch irgendwo anders steht und du es bereits in deinem Buch gelesen hast...
> Laut Guido Krüger (www.javabuch.de - Das Handbuch der Java-Programmierung) jedenfalls, sind "Factory" und "Singleton" zwei unterschiedliche Design-Patterns bzw. Entwurfsmuster.
> Singleton: Wirklich nur eine Instanz der Klasse.
> Factory: ein oder mehrere Instanzen einer speziellen Implementation einer Klasse.



Das stimmt natürlich, aber normalerweise braucht man nur eine Instanz einer Factory pro Anwendung daher werden die beiden Pattern oft gemeinsam genutzt.


----------



## Spacerat (30. Mrz 2009)

Ich hab' auch nie behauptet, du hättest behauptet usw...
Nein, worauf ich hinaus wollte, ist, das ich da gar keinen Sinn drin sehe, die beiden Patterns zu mischen. Mir fällt jedenfalls keiner ein. Was ich alledings hätte schreiben können: Singletons erstellen wirklich nur eine Instanz einer konkreten Klasse, während Factorys verschiedene Instanzen einer abstrakten Klasse produzieren.
Weshalb also 'ne Factory, wenn am Ende eh' ein Singleton rauskommen soll?


			
				foobar hat gesagt.:
			
		

> Das stimmt natürlich, aber normalerweise braucht man nur eine Instanz einer Factory pro Anwendung daher werden die beiden Pattern oft gemeinsam genutzt.


Ja, so kenn ich das auch.[highlight=java]Factory.getInstance().generateObject()[/highlight]


----------



## SlaterB (30. Mrz 2009)

nicht die Klasse, deren Objekte  von der Factory erzeugt werden (oder deren Subklassen) sollen ein Singleton sein,
sondern die Factory-Klasse selber


----------



## maki (30. Mrz 2009)

Factory:
1. Factory Method, manchmal statisch, eigentlich kein Kandidat für ein Singleton
2. Absract Factory, wurde "früher" oft als Singleton implementiert.



SlaterB hat gesagt.:


> von den meisten wirst du gleich hören, dass du gar kein Singleton benutzen sollst


Die meisten in diesem Forum finden Singletons gut, laut Umfrage  (@TS: Gehöre nicht dazu)


----------



## Ebenius (31. Mrz 2009)

maki hat gesagt.:


> Die meisten in diesem Forum finden Singletons gut, laut Umfrage  (@TS: Gehöre nicht dazu)


Ich bin ja kein Statistiker. Aber im richtigen Kontext: Derzeit haben 68 der 9450 Benutzer im Java-Forum abgestimmt. Von diesen 68 kamen 51 zur Überzeugung, dass Singleton manchmal sinnvoll ist und gelegentlich verwendet wird. Das liest sich irgendwie ganz anders... Hm... 

Ebenius


----------



## guni (31. Mrz 2009)

maki hat gesagt.:


> 2. Abstract Factory, wurde "früher" oft als Singleton implementiert.


??? ist eine abstrakte Klasse mit einer getInstance-Methode ein Widerspruch in sich?!


----------



## maki (31. Mrz 2009)

guni hat gesagt.:


> ??? ist eine abstrakte Klasse mit einer getInstance-Methode ein Widerspruch in sich?!


Nein, nicht unbedingt.


----------



## MarcB (31. Mrz 2009)

Das Abstract Factory Pattern hat nix mit abstrakten Klassen zu tun!
Das abstrakte daran ist, das es eine Schnittstelle zu einer Gruppe (Familie) von Factorys bietet, d.h. keine Kenntnis davon hat, welche Klassen nun konkret instanziiert werden.


----------

