В Java вы можете сделать конструкторы частными и предоставить фабрику в форме открытого вложенного класса, поскольку вложенные классы имеют доступ к закрытым членам класса, в котором они объявлены.
public class ExampleClass {
private ExampleClass() {
}
public class NestedFactory {
public ExampleClass createExample() {
return new ExampleClass();
}
}
Любой, кто хотел, мог создать экземпляр ExampleClass.NestedFactory и с его помощью создать экземпляр ExampleClasses.
Я не смог найти способ сделать это, который позволил бы вам потом наследовать от ExampleClass, поскольку компилятор Java требует, чтобы вы указали конструктор для суперкласса ... так что это недостаток.