Leave your Dog and Animal classes the same. and use the Builder pattern
public interface Builder<T> {
public T build(String nameString);
}
public static void main(String[] args){
Builder<Dog> builder = new Builder<Dog>()
{
@Override
public Dog build(String nameString)
{
return new Dog(nameString);
}
};
Dog dog = builder.build("Rocky");
System.out.print(dog.name);
}
The answers over at Instantiating object of type parameter explain it further as well.