This seems like a good fit for the factory method pattern. Try something like this:
public abstract class MyAbstractClass {
protected String greeting;
public void run() {
doSomething();
}
public abstract void doSomething();
public abstract MyAbstractClass makeClass();
}
public class MyClass1 extends MyAbstractClass {
public MyClass1() {
this.greeting = "Hello, World!";
}
@Override
public void doSomething() {
System.out.println(greeting);
}
@Override
public MyAbstractClass makeClass() {
return new MyClass1();
}
}
Then, whenever you need to create a specific instance just call makeClass()
in a single implementation of the main()
method located in the place you consider most convenient, for instance in MyAbstractClass
:
MyAbstractClass mac = new MyClass1();
MyAbstractClass obj = mac.makeClass();
The last line will return an appropriate instance depending on the class used for instantiating the concrete object.