public BaseInput(int x, int y) {
public abstract class Base {
protected static BaseInput validateAndGetAttributes(Input input) {
throw new Exception("Bad");
throw new Exception("Bad");
return new BaseInput(input.x, input.y);
public class Concrete1: Base {
public static Concrete1 GetInstance(Input input) {
BaseInput baseInput = Base.validateAndGetAttributes(input);
return new Concrete1(baseInput);
protected Concrete1(BaseInput input) {
public class Concrete2: Base {
public static Concrete2 GetInstance(Input input) {
BaseInput baseInput = Base.validateAndGetAttributes(input);
return new Concrete2(baseInput);
protected Concrete2(BaseInput input) {
public class Concrete3: Base {
public static Concrete3 GetInstance(Input input) {
BaseInput baseInput = Base.validateAndGetAttributes(input);
return new Concrete3(baseInput);
protected Concrete3(BaseInput input) {