I costruttori sono molto utili quando il tuo oggetto ha bisogno di molti argomenti / dipendenze per essere utile, o se vuoi consentire molti modi diversi di costruire l'oggetto.
Dalla parte superiore della mia testa, posso immaginare che qualcuno potrebbe voler "costruire" oggetti in un gioco 3D come questo:
// Just ignore the fact that this hypothetical god class is coupled to everything ever
new ObjectBuilder(x, y, z).importBlenderMesh("./meshes/foo")
.syncWithOtherPlayers(serverIP)
.compileShaders("./shaders/foo.vert", "./shaders/foo.frag")
.makeDestructibleRigidBody(health, weight)
...
Direi che questo esempio è più leggibile con i metodi builder che ho inventato proprio ora che con i parametri opzionali:
new Object(x, y, z, meshType: MESH.BLENDER,
meshPath: "./meshes/foo",
serverToSyncWith: serverIP,
vertexShader: "./shaders/foo.vert",
physicsType: PHYSICS_ENGINE.RIGID_DESTRUCTIBLE,
health: health,
weight: weight)
...
In particolare, le informazioni implicite dai nomi dei metodi del builder devono essere sostituite da ancora più parametri, ed è molto più facile dimenticare un parametro in un gruppo di parametri strettamente correlati. In realtà, lo shader di frammenti manca, ma non lo noteresti a meno che non sapessi cercarlo.
Naturalmente, se il tuo oggetto richiede solo da uno a cinque argomenti per la costruzione, non è necessario coinvolgere il modello di builder, indipendentemente dal fatto che tu abbia o meno dei parametri nominati / opzionali.