Я на самом деле не рекомендую следующее, и я, вероятно, никогда бы не сделал это сам.
Сказав это, вы можете сделать так, чтобы все объекты проверили, строятся ли они на заводе, и, если нет, сгенерируют подходящее исключение.
Для этого в конструкторах объектов просто вызовите Thread.currentThread().getStackTrace()
, затем «раскручивайте» стек, пока не доберетесь до фрейма сразу после (до) конструктора. Теперь вы можете проверить вызывающего абонента и выдать исключение, если это не Factory
.
Этот метод может предотвращать создание экземпляров новых объектов даже с помощью отражения.
Теперь, очевидно, есть издержки при проверке и раскручивании трассировки стека, и если фабрика не может интернировать / кэшировать ранее построенные объекты (т.е. она должна каждый раз возвращать новый экземпляр), и вы вызываете его достаточно много раз все это может стать дорогостоящим.
Следовательно, применяются обычные предостережения «только потому, что это можно сделать, не означает, что вы должны это делать». Опять же, если вам действительно придется это сделать, то хорошо бы знать хотя бы один способ.