Skip to content

Instantly share code, notes, and snippets.

@itarato
Created February 14, 2015 22:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save itarato/ba9c72af4ad16f9b46ef to your computer and use it in GitHub Desktop.
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.
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