Фабричный метод (с перегрузкой)

public class Person {
   protected String name;
   protected int age;
   protected Person (String name, int age) {
      this.name=name;
      this.age=age;
   }
   public static Person generate(String name, int age) {
       return new Person(name,age);
   }
   public static Student generate(String name, int age, String spec) {
       return new Student(name,age,spec);
   }
}
class Student extends Person 
{
    protected String spec;
    private Student (String name, int age, String spec) {
      super(name,age);
      this.spec=spec;
   }    
}
public class Main 
{
   public static void main(String[] args) {
      Person  p = Person.generate("Вася",30);
      Person  q = Person.generate("Вася",30);
      Student s = Person.generate("Маша",20,"математика");
   }
}