There are many ways to do this, assuming that breedyou mean "create me children."
Reflection
. no-args , , Class.newInstance:
public Animal breed() {
try {
return (Animal) getClass().newInstance();
} catch (Exception ex) {
return null;
}
}
no-args , . , Cat(int, String) Dog(int, String), Class.getConstructor newInstance:
return (Animal) getClass().getConstructor(int.class, String.class).newInstance(0, "Unnamed");
int String , , . .
:
public interface Provider<T> {
T create();
}
:
public abstract class Animal {
private final Provider<Animal> animalProvider;
protected Animal( ... , Provider<Animal> animalProvider) {
this.animalProvider = animalProvider;
}
public Animal breed() {
return animalProvider.create();
}
}
Provider<Animal> , :
public class Dog extends Animal {
public Dog( ... ) {
super( ... , new DogProvider());
}
private static class DogProvider implements Provider<Animal> {
public Animal create() {
return new Dog( ... );
}
}
}
.
:, breed " ", , . , , :
public abstract class Animal {
protected final Breed breed;
protected Animal( ... , Breed breed) {
this.breed = breed;
}
public Breed getBreed() {
return breed;
}
}
get/set . Java bean, , . :
public class Dog extends Animal {
public Dog( ... ) {
super( ... , new Breed( ... ));
}
}