//Titel:            Testbeispiel fuer das Design Pattern Singleton
//Version:          05.05.2013
//Copyright:        HS-Harz, FB AI
//Autor:            Dipl.-Inf.(TU) Dipl.-Ing.(FH) Michael Wilhelm
//Firma:            HS-Harz
//Beschreibung:     Dritter Versuch  mit getInstance, static Erzeugung


// Design Pattern Singleton
// Stellt sicher, dass nur eine Instanz existiert
// dazu wird der Default-Konstrutor als private bzw. protected definiert
// durch die statische Erzeugung ist diese Variante Thread-sicher

// Beispiel mit Test-Ausgabe
// a und b sind gleiche Instanzen

import java.io.*;



public class Singleton_extends {

  private static void pause() {
    try {
      System.in.read();
    }
    catch (IOException e) {
    }
  }  // pause


  private void test1() {
    System.out.println(" ");
    System.out.println(" ");
    
     
    Ball b1  = Ball.getInstance();
    //System.out.println("b1: "+ b1 +"\n\n" );  // 2
    b1.setRadius(12);

    Ball b2  = Ball.getInstance();
 //   System.out.println("b1: "+ b1  );  
   // System.out.println("b2: "+ b2  );  // 12

    Fussball f1  = Fussball.getInstance();
    System.out.println("\n\nf1: "+ f1 ); 
    WMFussball wf1  = WMFussball.getInstance();

    System.out.println("wf1: "+ wf1+"\n\n\n" );  
    Ball b3 = (Ball) wf1;
    b3.setRadius(44);

    System.out.println("b1: "+ b1 ); 
    System.out.println("b2: "+ b2 ); 
    System.out.println("b3: "+ b3 ); 
    Ball b4  = Ball.getInstance();
    System.out.println("b4: "+ b4 +"\n\n" );  // 2
    b4.setRadius(60);
    System.out.println("b1: "+ b1  );  
    System.out.println("b2: "+ b2  );  // 12
    System.out.println("b4: "+ b4  );  // 12
  }

 static public void main(String[] args) {
    Singleton_extends in = new Singleton_extends();
    in.test1();
    pause();
  } // main

}  // Single_extends



class Ball {
  private static Ball instance = new Ball(5);

    private int r=10;

    protected Ball(int r) {
      this.r = r;
    }
    public static Ball getInstance(){
         return instance;
    }
    public int getRadius() {
      return r;
    }
    public void setRadius(int value) {
      r = value;
    }  

   public String toString() {
     return "Ball, radius: "+r;
   }
}


class Fussball extends Ball {

  private static Fussball instance = new Fussball(15, true);

  boolean leder;

    protected Fussball(int r, boolean leder) {
      super(r);
      this.leder = leder;
    }
    public static Fussball getInstance(){
         return instance;
    }
    public boolean isLeder() {
      return leder;
    }
    public void setLeder(boolean leder) {
      this.leder = leder;
    }  

   public String toString() {
     return "Fussball: "+super.toString() + "    leder: "+leder;
   }

} // Fussball


class WMFussball extends Fussball {

  private static WMFussball instance = new WMFussball(20, true, "Oddibas");

  private String hersteller;

    protected WMFussball(int r, boolean leder, String hersteller) {
      super(r, leder);
      this.hersteller = hersteller;
    }
    public static WMFussball getInstance(){
         return instance;
    }
    public String getHersteller() {
      return hersteller;
    }
    public void setHersteller(String hersteller) {
      this.hersteller = hersteller;
    }  

   public String toString() {
     return "WMFussball: "+super.toString() + "    herst.: "+hersteller+"    ";
   }

} // WMFussball


