Uma maneira de fazer isso é fazer com que suas classes implementem uma interface ou estendam uma classe abstrata.
As classes que estendem a classe abstrata precisam ser marcadas como finais e tornei os construtores "packae privados.
Essas classes eu adicionei em um “modelo” de pacote separado. Dessa forma o cliente “Principal” não tem acesso aos construtores.
Agora, o próximo passo é criar uma classe Helper “BusinessRules” que tem métodos públicos estáticos, que o cliente “Principal” pode usar para criar as diferentes regras de negócios
public class Main {
public static void main(String[] args) {
BusinessCentral ruleb = BusinessRules.getRuleB(1234, 635);
BusinessCentral rulea = BusinessRules.getRuleA(7777, 9999);
System.out.println(ruleb);
System.out.println(rulea);
rulea = BusinessRules.getRuleA(-234, 9899); // invalid value
System.out.println(rulea);
}
}
package model;
public abstract class BusinessCentral {
protected int idUsuario;
protected int idEndPoint;
protected BusinessCentral(int idUsuario, int idEndPoint) {
if(idUsuario < 0 || idEndPoint < 0)
throw new IllegalArgumentException("May not be negative");
this.idUsuario = idUsuario;
this.idEndPoint = idEndPoint;
}
@Override
public String toString() {
return "BusinessCentral [idUsuario=" + idUsuario + ", idEndPoint=" + idEndPoint +
"Business Rule = " + this.getClass().getName() + "]";
}
package model;
public final class BusinessRuleA extends BusinessCentral {
BusinessRuleA(int idUsuario, int idEndPoint) {
super( idUsuario, idEndPoint);
}
}
package model;
public class BusinessRuleB extends BusinessCentral {
BusinessRuleB(int idUsuario, int idEndPoint) {
super( idUsuario, idEndPoint);
}
}
package model;
/*
- Helper class with static public methods to create the different BusinessRules
-
*/
public class BusinessRules {
public static BusinessCentral getRuleA(int idUsuario, int idEndPoint) {
return new BusinessRuleA(idUsuario,idEndPoint);
}
public static BusinessCentral getRuleB(int idUsuario, int idEndPoint) {
return new BusinessRuleB(idUsuario,idEndPoint);
}
}