Многие фреймворки избегают использования прямых конструкторов для сложных объектов, предпочитая вместо этого более элегантные фабрики.
Шаблон генерируется путем «компиляции» регулярного выражения, поэтому вы делаете статический вызов метода «compile». Инициализирует все, что нужно. Сопоставление является специфическим для шаблона и, следовательно, генерируется объектом шаблона, а не непосредственно пользователем.
Если бы у сопоставителя был конструктор, который принял шаблон, то у конструктора сопоставителя мог бы быть доступ к закрытым полям объекта шаблона.
Другое потенциальное преимущество этого подхода (по сравнению с прямым построением) состоит в том, что в принципе возможно прозрачно предоставлять различные механизмы согласования для пользователя, создавая различные подтипы Pattern и Matcher за кулисами. Например, предположим, что у вас были разные реализации сопоставления для регулярных выражений, которые соответствуют строке фиксированной длины (например, без подстановочных знаков), и для регулярных выражений, которые содержат звездочку или плюс, и что была разница в производительности. Это, как говорится, не похоже, что это на самом деле имеет место, поскольку Matcher определен как конечный класс, хотя вполне вероятно, что внутреннее устройство тесно связано с шаблоном.