package DesignPatterns.Erzeugungsmuster_CreationalPatterns.Singaleton;

/* 
 *  - verhindert, dass von einer Klasse mehr als ein Objekt erstellt werden kann
 *  	Das wird dadurch erreicht, dass das gewünschte Objekt in einer Klasse selbst erzeugt dann als statische Instanz abgerufen wird
 *  
 *  Eigenschaften: 
 *  - Konstruktor muss als „private“ deklariert. 
 *  - Eine öffentliche statische Methode, die die Instanz der Klasse zurückgib
 *  - private static memberVariable
 */
public class Singleton {
	
	 // privater Konstruktor mit Zugriffsschutz von außen, also die kann nicht mit new erzeugt werden
	private Singleton() {}
	
	 // vor Zugriff von außen geschützt und statisch
	private static Singleton erzeuge_Objekt = null;
	
	
	// öffentliche Methode, Aufruf durch Code
	// Aber Thread_unsicher
	public static Singleton getObejekt_Thread_unsicher() {
		
		if (erzeuge_Objekt == null)
			erzeuge_Objekt = new Singleton();
		return erzeuge_Objekt;	
	}
	
	// Thread_sicher:
	 public static synchronized Singleton getObejekt_Thread_sicher() {
	        if (erzeuge_Objekt == null) {
	            erzeuge_Objekt = new Singleton();
	        }
	        return erzeuge_Objekt;
	    }
	
	 
	// test
	public void print() {
		System.out.println("Hallo Welt!");
	}
	
	
	public static void main(String[] args) {
		
		// Verwendung Test
		Singleton objekt = Singleton.getObejekt_Thread_unsicher();
		objekt.print(); // Hallo Welt!
	}
	
}
