Я думаю, что у вас будет либо сбой компилятора, либо предупреждение, если ваш общедоступный метод фабрики попытается вернуть что-то "скрытое".
Нет, вы не можете скрыть публичный класс, не переопределив собственный ClassLoader
, не используя OSGi или что-то подобное.
Что вы можете сделать, это отделить интерфейс API от реализации, например, есть один проект, который содержит только интерфейсы, и другой объект, который содержит имплементации. Однако вы все еще не можете скрыть классы реализации.