Muchos Builder Patternejemplos hacen de la Builderclase interna del objeto que construye.
Esto tiene algún sentido ya que indica lo que Buildercompila. Sin embargo, en un lenguaje tipado estáticamente sabemos qué Buildercompila.
Por otro lado, si se Buildertrata de una clase interna, debe saber en qué clase se Buildercompila sin mirar dentro de la clase Builder.
Además, tener el constructor como una clase interna reduce el número de importaciones, ya que puede ser referenciado por la clase externa, si eso le importa.
Y luego hay ejemplos prácticos donde el Builderestá en el mismo paquete, pero no una clase interna, como StringBuilder. Usted sabe que Builder debería construir un Stringporque se llama así.
Dicho esto, la única buena razón por la que puedo pensar para hacer una Builderclase interna es que sabes cuál es la clase Buildersin saber su nombre o sin depender de las convenciones de nombres. Por ejemplo, si StringBuilderfuera una clase interna de String, probablemente habría sabido que existía antes que yo (especulativo).
¿Hay alguna otra razón para hacer de la Builderclase interna o simplemente se reduce a preferencias y rituales?
fuente

No hay "debería" en este caso. Definir un generador dentro de otra clase o tenerlo separado es ortogonal al patrón del generador. Muchos ejemplos hacen esto debido a la conveniencia de presentar el código en un archivo consistente (también para acceder a miembros privados, pero eso también depende del contexto). Siéntase libre de hacer lo contrario
fuente