IMO the constructors don't form a good API while creating objects, especially when the number of arguments are large and they are of the same type.
new Person(String, String, String, String); // what the?? this is what may
// show up in IDEs
where it actually means Person(firstname, lastname, screenname, password, (just for example's sake)
As cletus mentions, the Builder pattern with chaining is good. Another advantage with a builder is that, if the objects are immutable, the builder can return the same object (in this case you can have a package private constructor with 15 args that only the builder knows about). Builders can also return any subtype of the objects that they build
Another approach you could take is consider using an internal DSL. But this makes sense only if you are building objects like configurations, queries, etc. See if having an internal DSL makes sense in your case.
We had a similar problem in our project. We had to fetch certain values from a home gateway (our product). It supported a request-response, query based XML protocol over http. But creating of Request object for sending in the UI was tedious, with setting up Request obejcts with appropriate parameters and filters, etc.
Initially our request object looked like this:
Request r = new Request("SET");
r.setAction("add"); // modify, add, delete
r.setModuleName("NPWIFI"):
r.addParameter(new Param("wifiAclMac", "aa:bb:cc:dd:ee:ff"));
r.addParameter(new Param("wifiCommit", "commit"));
r.setActionParam("wifiAclRowStatus")
r.addFilter(new Filter(Type.EQUALS, "wifiInterface", "wl0"));
r.addFilter(new Filter(Type.EQUALS, "wifiAclMac", "yourgateway"));
Resonse r = gwSession.sendRequest(r);
So we changed it into an internal DSL that had an SQL like feel but only programmatic
Query q = DQL.add("wifiAclMac", "wifiCommit").into("NPWIFI").values
("aa:bb:cc:dd:ee:ff", "commit").withAp("wifiAclRowStatus")
.where("wifiInterface").is("wl0")
.and("wifiAclMac").is("aa:bb:cc:dd:ee:ff").end();
The DQL "query builder" object did all the building with validation and also proved to be a lot convenient to use.
Builders and DSLs are a elegant and powerful means of creating and building up objects, but see what makes sense in your case.