Created
February 14, 2015 22:46
-
-
Save itarato/ba9c72af4ad16f9b46ef to your computer and use it in GitHub Desktop.
Trying to find a way for a factory that accepts an interface as an input.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.lang.reflect.Method; | |
public class Main { | |
public static void main(String[] args) { | |
AnimalParam ap = new AnimalParam("A"); | |
AnimalFactory<Animal, AnimalParam> af = new AnimalFactory<Animal, AnimalParam>(); | |
Animal a = af.create(Animal.class, AnimalParam.class, ap); | |
System.out.println(a); | |
BirdParam bp = new BirdParam("B", "C"); | |
AnimalFactory<Bird, BirdParam> bf = new AnimalFactory<Bird, BirdParam>(); | |
Bird b = bf.create(Bird.class, BirdParam.class, bp); | |
System.out.println(b); | |
} | |
} | |
class Animal { | |
public String name; | |
public String toString() { return "[Animal, name: " + name + "]"; } | |
public static Animal create(AnimalParam ap) { | |
Animal a = new Animal(); | |
a.name = ap.name; | |
return a; | |
} | |
} | |
class Bird extends Animal { | |
public String color; | |
public String toString() { return "[Bird, name: " + name + ", color: " + color + "]"; } | |
public static Bird create(BirdParam bp) { | |
Bird b = new Bird(); | |
b.name = bp.name; | |
b.color = bp.color; | |
return b; | |
} | |
} | |
class AnimalParam { | |
public String name; | |
public AnimalParam (String name) { this.name = name; } | |
} | |
class BirdParam extends AnimalParam { | |
public String color; | |
public BirdParam (String name, String color) { super(name); this.color = color; } | |
} | |
class AnimalFactory<T extends Animal, PT extends AnimalParam> { | |
public void template(T a) { | |
a.name += 'x'; | |
// other template actions | |
} | |
public T create(Class<T> animalClass, Class<PT> animalParamClass, PT param) { | |
try { | |
Method m = animalClass.getMethod("create", animalParamClass); | |
T a = (T) m.invoke(null, param); | |
template(a); | |
return a; | |
} catch (Exception e) { | |
return null; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment