# Singleton pattern



## dotlens (15. Nov 2004)

hallo

wann ist es sinvoll denn singleton pattern zu verwenden? in einigen beschreibungen habe ich gelesen es sei nicht so schönes OOP und man sollte es nicht zu oft verwenden.
bei meinem progi habe ich es für den Controller verwendet, da er so einfach von überall zugänglich ist. ist meine überlegung korrekt? wann verwendet ihr ihn?? 

danke und gruss


----------



## Illuvatar (15. Nov 2004)

Das is schönes OOP, und sicher schöneres OOP als static 

*beibenischleim*


----------



## dotlens (15. Nov 2004)

aber dadurch hat man doch static??


```
private static Controller controller;

	public static Controller createController() {
		if(controller == null)
			controller = new Controller();
		return controller;
	}
```


----------



## stev.glasow (15. Nov 2004)

dotlens hat gesagt.:
			
		

> hallo
> 
> wann ist es sinvoll denn singleton pattern zu verwenden? in einigen beschreibungen habe ich gelesen es sei nicht so schönes OOP und man sollte es nicht zu oft verwenden.
> bei meinem progi habe ich es für den Controller verwendet, da er so einfach von überall zugänglich ist. ist meine überlegung korrekt? wann verwendet ihr ihn??
> ...


Kein schönes OOP  :shock:   :bahnhof: 
Das Pattern ist nützlich wenn du nur eine Instance einer Klasse zu lassen willst.
z.B. Ich habe eine Player Klasse die Sound abspielen soll, und wenn es zwei oder mehr Instanzen geben würde, würden die Sounds sich überschneiden (oder so, ist nur ein Beispiel)


----------



## Student (15. Nov 2004)

stevg hat gesagt.:
			
		

> z.B. Ich habe eine Player Klasse die Sound abspielen soll, und wenn es zwei oder mehr Instanzen geben würde, würden die Sounds sich überschneiden (oder so, ist *nur ein Beispiel*)



aber ein gutes.


----------



## dotlens (15. Nov 2004)

danke, hab nun mehr oder weniger den Durchblick


----------



## bygones (15. Nov 2004)

hier gibts auch noch was dazu: http://www.java-forum.org/de/viewtopic.php?t=6090#28141


----------



## Beni (15. Nov 2004)

stevg hat gesagt.:
			
		

> Das Pattern ist nützlich wenn du nur eine Instance einer Klasse zu lassen willst.
> z.B. Ich habe eine Player Klasse die Sound abspielen soll, und wenn es zwei oder mehr Instanzen geben würde, würden die Sounds sich überschneiden (oder so, ist nur ein Beispiel)



Andererseits könnte man Argumentieren, dass der Benutzer vielleicht zwei Sounds überlagern _will_... :wink:

Ne, ist ein gutes Beispiel. Aber wenn man es für Dinge "nicht gleichzeitig zwei Dokumente öffnen können, weil man sowieso nur eines lesen kann" missbraucht (und genau das tun leider viele Programmierer), ist es am falschen Platz.


----------



## dotlens (15. Nov 2004)

@dbc danke hab ich schon gelesen, sonst wüsst ich gar nichts vom singleton


----------



## bygones (15. Nov 2004)

ich bin Verfechter der Singleton - Configuration klasse.... in meinen Applikationen ist die config klasse für das Auslesen des config files zuständig (daher der Name  ) - sie hält alle relevanten Infos für das Programm. Daher soll sie nur überall zugreifbar sein und es sollen nicht zwei versch. Configurationen rummschwirren..

sonst noch gern genommes Singleton ist ein DatabasManager - um nicht versch. DB connections offen zu haben....


----------



## dark_red (16. Nov 2004)

Ich denke das wichtigste wurde gesagt. Gerade um Resourcen zu schonen, also Handles, Connections usw wiederzuverwenden ist das Pattern eine Lösung. 

Des weiteren ist es unersetzbar bei Einführungskursen in Patterns oder UML: Ein klassisches Beispiel halt. Ich denke es geniesst da schon fast "Hello World"-Status.  :bae:


----------



## helium (24. Nov 2004)

Ich denke das Problem ist nur, das viele Anfänger Singletons bauen, wo Mono-State sinnvoller wäre.


----------



## dark_red (24. Nov 2004)

Darin sehe ich eigentlich weniger ein Problem (auch wenn). Anfänger/Umsteiger scheinen sich gerne etwas bauen zu wollen, in dem sie ihre globalen Variabeln/Mothoden unterbringen können ohne OOP zu denken. Dabei finden sie schnell das Singleton, obwohl man dafür eher das MonoState benötigen würde, aber trotzdem ist ihr Denkansatz total falsch (sie denken Prozedual und wollen das irgendwie in OOP unterbringen). 

Ich brauche MonoState eigentlich so gut wie nie. Singleton eher selten. Sobald ich bei einem MonoState ende, würde ich mir gedanken um das Klassendesign machen... 

btw... hast du gerade ein gutes MonoState Bespiel?


----------



## dotlens (24. Nov 2004)

hmmm, was ist denn MonoState?? hab im forum nichts gefunden...


----------



## Student (24. Nov 2004)

:arrow: http://c2.com/cgi/wiki?MonostatePattern

grad mal per google rausgesucht (1.eintrag) .. ich kenn das auch nicht.


----------



## Bleiglanz (24. Nov 2004)

```
// am besten einen verwirrenden namen "create" verwenden
   public static Controller createController() {
      if(controller == null)
         controller = new Controller();
      return controller;
   }
```
mal von der synchronized Problematik abgesehen, warum nehmen einfach alle Anfänger irgendwelche Beispiele aus dem Netz und verwenden dann immer die späte initialisierung?

der code muss doch eh irgendwann ausgeführt werden, und wenn man dann beim programmstart gleich createController aufruft, dann ist das doch vollkommen überflüssig (code bloat)

```
private static Controller controller=new Controller();

public static Controller getController() {
      return Controller.controller;
}
```


----------



## Student (24. Nov 2004)

ist das nicht eigentlich egal?


----------



## Sky (24. Nov 2004)

Bleiglanz hat gesagt.:
			
		

> der code muss doch eh irgendwann ausgeführt werden, und wenn man dann beim programmstart gleich createController aufruft, dann ist das doch vollkommen überflüssig (code bloat)



Deine Annahem ist nur Richtig, wenn Du davon ausgehst, dass die zu erstellende Klasse für den Programmablauf zwingend erforderlich ist. Wenn Du aber ein Programm hast, welches mehr als eine fachliche Funktion hat und Du einen speziellen Controller nicht für alle Funktionen brauchst so macht es m.E. mehr Sinn die Instanz in dem Moment zu erzeugen, wo sie benötigt wird.


----------



## Bleiglanz (24. Nov 2004)

das meinte ich mit


> ...werden, und wenn man dann beim programmstart gleich createController...


Wenn die Instanz erst später benötigt wird UND die erzeugung eine gewisse zeit in Anspruch nimmt, ist nichts gegen die lazy initialization einzuwenden


----------



## helium (27. Nov 2004)

Oder wenn das Singleton Teil einer Bibliothek ist und nicht zwangsweise verwendet wird.


----------

