То, что вы описываете, называется фабричным шаблоном (а не шаблоном компоновщика).
Самый простой способ реализовать это - сделать ваш конструктор частным и предоставить статическую фабрику.методы класса Product.Это минимальная реализация:
public class Product {
private Product() {}
public static Product create() {
return new Product();
}
}
В JDK существует множество классов, которые следуют этому шаблону, например Integer.parseInt - это статический метод фабрики, который создается как Integer
(хотя конструктор не является частным)
Кроме того, вы можете создать отдельный класс Factory в том же пакете, что и Product, и дать конструктору Product видимость по умолчанию.
Следует избегать использования отражения вВообще, если вам это действительно не нужно.В этом случае вам это не нужно - делайте все как можно проще (но не проще).