Как защитить конкретизацию конкретных подклассов при использовании фабричного шаблона? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть абстрактный класс Employee с двумя конкретными подклассами, MinorEmployee и AdultEmployee.Я знаю, как создать статический метод фабрики в Employee, который создает экземпляр конкретного подкласса:

public abstract class Employee() {
    public static Employee create(LocalTime birthdate) {
        if (/* omitted */) {
            return new MinorEmployee();
        } else {
            return new AdultEmployee();
        }
    }
}

Есть ли способ в Java, чтобы запретить вызывающей стороне в том же пакете непосредственно создавать экземпляр MinorEmployee или AdultEmployee?

Я не могу сделать их конструкторы частными, или Employee не сможет получить к ним доступ.Я также не хочу вкладывать их в Employee.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Вы можете объявить конструкторы в MinorEmployee и AdultEmployee как private, а затем использовать отражение в методе фабрики:

public static Employee create(LocalTime birthdate) {
    try {
        Class<? extends Employee> clazz;
        if (omitted) {
            clazz = MinorEmployee.class;
        } else {
            clazz = AdultEmployee.class;
        }
        Constructor<? extends Employee> cons = clazz.getConstructor();
        cons.setAccessible(true);
        return cons.newInstance();
    } catch (NoSuchMethodException | SecurityException
            | InstantiationException | IllegalAccessException
            | InvocationTargetException ex) {
        // handle the exception
    }
}    
0 голосов
/ 04 марта 2019

Я могу дать вам подсказку о том, что вы можете попробовать, хотя могут быть некоторые предостережения:

  • создайте отдельный класс фабрики вместо базового класса.

  • сделать конструктор частным в фабричном классе

  • создать фиктивный закрытый объект в фабричном классе

  • Пусть MinorEmployee и единственный конструктор AdultEmployee принимают объект фабричного класса.Поскольку объект фабрики не может существовать вне класса из-за закрытого конструктора, практически никто другой не сможет создавать экземпляры этих классов извне.

  • Использование фиктивного объекта для передачи вВаш фабричный метод.

...