Доброго времени суток! Стало интересно, как у нас получается создать объект типа Hen, если мы делаем класс Hen абстрактным, а создавать экземпляры абстрактных классов нельзя.
public class Solution {
    public static void main(String[] args) {
        Hen hen = HenFactory.getHen(Country.RUSSIA);
        System.out.println(hen.getCountOfEggsPerMonth());
    }

    static class HenFactory {

        static Hen getHen(String country) {
            Hen hen = null;
            if (country.equals("Belarus"))
                return new BelarusianHen();
            else if (country.equals("Ukraine"))
                return new UkrainianHen();
            else if (country.equals("Russia"))
                return new RussianHen();
            else if (country.equals("Moldova"))
                return new MoldovanHen();
            return hen;
        }
    }
}