From 144cbe916ea9ce7871e6320b394a385050449de9 Mon Sep 17 00:00:00 2001
From: Peter Hertkorn <peter.hertkorn@reutlingen-university.de>
Date: Sun, 11 Oct 2020 21:47:02 +0200
Subject: [PATCH] Change configurable factory to registry

---
 src/aliensimulator/AlienSimulator.java        |  7 ++++++
 src/aliensimulator/predators/HishQuTen.java   |  8 ++++++
 src/aliensimulator/predators/Predator.java    |  2 ++
 .../predators/PredatorFactory.java            | 16 +++---------
 .../predators/PredatorRegistry.java           | 25 +++++++++++++++++++
 src/aliensimulator/predators/Yautja.java      |  8 ++++++
 .../predators/predator.properties             |  2 --
 7 files changed, 54 insertions(+), 14 deletions(-)
 create mode 100644 src/aliensimulator/predators/PredatorRegistry.java
 delete mode 100644 src/aliensimulator/predators/predator.properties

diff --git a/src/aliensimulator/AlienSimulator.java b/src/aliensimulator/AlienSimulator.java
index 5a69d63..8814e44 100644
--- a/src/aliensimulator/AlienSimulator.java
+++ b/src/aliensimulator/AlienSimulator.java
@@ -16,6 +16,13 @@ import aliensimulator.verhalten.ErdeNeutralAdapter;
 public class AlienSimulator {
 	
 	public static void main(String[] args) {
+		try {
+			Class.forName("aliensimulator.predators.HishQuTen");
+			Class.forName("aliensimulator.predators.Yautja");
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
 		AlienFactory alienFactory = new AlienFactory();
 
 		Alien alienMars = alienFactory.createAlien("mars");
diff --git a/src/aliensimulator/predators/HishQuTen.java b/src/aliensimulator/predators/HishQuTen.java
index c65210b..b971f0f 100644
--- a/src/aliensimulator/predators/HishQuTen.java
+++ b/src/aliensimulator/predators/HishQuTen.java
@@ -5,6 +5,10 @@ import aliensimulator.verhalten.ErdeNeutralAdapter;
 
 public class HishQuTen extends Predator {
 
+	static {
+		PredatorRegistry.register(new HishQuTen());
+	}
+
 	public HishQuTen() {
 		this.setErdeBesuchverhalten(new ErdeNeutralAdapter(new NeutralBesuchen()));
 	}
@@ -14,4 +18,8 @@ public class HishQuTen extends Predator {
 		System.out.println("Ich bin ein Hish-Qu-Ten.");
 	}
 
+	@Override
+	public Boolean canHandle(String type) {
+		return type.equalsIgnoreCase("hishquten");
+	}
 }
diff --git a/src/aliensimulator/predators/Predator.java b/src/aliensimulator/predators/Predator.java
index 56bc7ed..1ca5559 100644
--- a/src/aliensimulator/predators/Predator.java
+++ b/src/aliensimulator/predators/Predator.java
@@ -7,6 +7,8 @@ public abstract class Predator {
 
     public abstract void darstellen();
 
+    public abstract Boolean canHandle(String type);
+
     public void fliegen() {
         System.out.println("Ich fliege durch den Weltraum.");
     }
diff --git a/src/aliensimulator/predators/PredatorFactory.java b/src/aliensimulator/predators/PredatorFactory.java
index 6629222..e1c84e6 100644
--- a/src/aliensimulator/predators/PredatorFactory.java
+++ b/src/aliensimulator/predators/PredatorFactory.java
@@ -1,23 +1,15 @@
 package aliensimulator.predators;
 
-
-import java.io.IOException;
-import java.util.Properties;
-
 public class PredatorFactory {
 
 	public Predator createPredator(String type) {
 		Predator predator = null;
-		Properties properties = new Properties();
 
-		try {
-			properties.load(this.getClass().getResourceAsStream("predator.properties"));
-			String className = properties.getProperty(type);
-			Class<?> classOfPredator = Class.forName(className);
-			predator = (Predator) classOfPredator.newInstance();
-		} catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e) {
-			e.printStackTrace();
+		predator = PredatorRegistry.getPredatorHandler(type);
+		if (predator == null) {
+			System.out.println("Kein Handler gefunden");
 		}
+
 		return predator;
 	}
 }
diff --git a/src/aliensimulator/predators/PredatorRegistry.java b/src/aliensimulator/predators/PredatorRegistry.java
new file mode 100644
index 0000000..e43f54a
--- /dev/null
+++ b/src/aliensimulator/predators/PredatorRegistry.java
@@ -0,0 +1,25 @@
+package aliensimulator.predators;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+
+public class PredatorRegistry {
+    static List<Predator> predatorHandlers = new ArrayList<Predator>();
+
+    static void register(Predator predator) {
+        predatorHandlers.add(predator);
+    }
+
+    static Predator getPredatorHandler(String type) {
+        ListIterator<Predator> iter = predatorHandlers.listIterator();
+        while (iter.hasNext()) {
+            Predator predator = iter.next();
+            if (predator.canHandle(type)) {
+                return predator;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/aliensimulator/predators/Yautja.java b/src/aliensimulator/predators/Yautja.java
index b7aee75..d84de21 100644
--- a/src/aliensimulator/predators/Yautja.java
+++ b/src/aliensimulator/predators/Yautja.java
@@ -5,6 +5,10 @@ import aliensimulator.verhalten.ErdeZerstoererischAdapter;
 
 public class Yautja extends Predator {
 
+	static {
+		PredatorRegistry.register(new Yautja());
+	}
+
 	public Yautja() {
 		this.setErdeBesuchverhalten(new ErdeZerstoererischAdapter());
 	}
@@ -14,4 +18,8 @@ public class Yautja extends Predator {
 		System.out.println("Ich bin ein Yautja.");
 	}
 
+	@Override
+	public Boolean canHandle(String type) {
+		return type.equalsIgnoreCase("yautja");
+	}
 }
diff --git a/src/aliensimulator/predators/predator.properties b/src/aliensimulator/predators/predator.properties
deleted file mode 100644
index a1f5396..0000000
--- a/src/aliensimulator/predators/predator.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-yautja=aliensimulator.predators.Yautja
-hishquten=aliensimulator.predators.HishQuTen
-- 
GitLab