package DesignPatterns.Erzeugungsmuster_CreationalPatterns.Factory;

public class FactoryMit_Java_Reflection {
	
	 public static void main(String[] args) {
	        try {
	            // Erzeugung eines Hundes mit der Factory-Methode
	            Tier hund = Tier.erzeugeTier("Hund", 3);
	            System.out.println(hund);  // Ausgabe: Hund, Alter: 3

	            // Erzeugung einer Katze mit der Factory-Methode
	            Tier katze = Tier.erzeugeTier("Katze", 5);
	            System.out.println(katze);  // Ausgabe: Katze, Alter: 5
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }
}
//Basisklasse Tier
class Tier {
    private int alter;

    public Tier(int alter) {
        this.alter = alter;
    }

    public int getAlter() {
        return alter;
    }

    @Override
    public String toString() {
        return "Tier, Alter: " + alter;
    }

    // Die Factory-Methode, die ein Tier-Objekt erzeugt
    public static Tier erzeugeTier(String tierart, int alter) throws Exception {
        // Sucht die Klasse basierend auf dem tierart-String und erstellt eine neue Instanz
        return (Tier) Class.forName(tierart)
                .getDeclaredConstructor(Integer.TYPE)
                .newInstance(alter);
    }
}

//Klasse Hund, erbt von Tier
class Hund extends Tier {
    public Hund(int alter) {
        super(alter);
    }

    @Override
    public String toString() {
        return "Hund, Alter: " + getAlter();
    }
}

//Klasse Katze, erbt von Tier
class Katze extends Tier {
    public Katze(int alter) {
        super(alter);
    }

    @Override
    public String toString() {
        return "Katze, Alter: " + getAlter();
    }
}