IMO, конструкторы не формируют хороший API при создании объектов, особенно когда количество аргументов велико и они одного типа.
new Person(String, String, String, String); // what the?? this is what may
// show up in IDEs
, где это на самом деле означает Персона (имя, фамилия, имя, пароль, (например, ради)
Как упоминает Клетус, шаблон Строителя с цепочкой хорош. Еще одно преимущество в компоновщике состоит в том, что , если объекты неизменяемы, компоновщик может возвращать тот же объект (в этом случае вы можете иметь закрытый конструктор пакета с 15 аргументами, которые только Строитель знает о). Строители также могут возвращать любой подтип объектов, которые они строят
Другой подход, который вы могли бы использовать, - рассмотреть возможность использования внутреннего DSL. Но это имеет смысл, только если вы создаете такие объекты, как конфигурации, запросы и т. Д. Посмотрите, имеет ли смысл иметь внутренний DSL в вашем случае.
У нас была похожая проблема в нашем проекте. Нам пришлось получить определенные значения из домашнего шлюза (наш продукт). Он поддерживал запрос-ответ, основанный на запросе XML-протокол через http. Но создание объекта Request для отправки в пользовательском интерфейсе было утомительным, с настройкой объектов Request с соответствующими параметрами и фильтрами и т. Д.
Изначально наш объект запроса выглядел так:
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);
Итак, мы изменили его на внутренний DSL, который был похож на SQL, но только программный
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();
Объект DQL «построитель запросов» выполнил всю сборку с проверкой и также оказался очень удобным в использовании.
Строители и DSL - это элегантные и мощные средства создания и создания объектов, но посмотрите, что имеет смысл в вашем случае.