Widziałem wiele implementacji wzorca Builder (głównie w Javie). Wszystkie mają klasę encji (powiedzmy Personklasę) i klasę konstruktora PersonBuilder. Konstruktor „układa” różne pola i zwraca new Personargument z przekazanymi argumentami. Dlaczego jawnie potrzebujemy klasy konstruktora, zamiast umieszczać wszystkie metody konstruktora w Personsamej klasie?
Na przykład:
class Person {
private String name;
private Integer age;
public Person() {
}
Person withName(String name) {
this.name = name;
return this;
}
Person withAge(int age) {
this.age = age;
return this;
}
}
Mogę po prostu powiedzieć Person john = new Person().withName("John");
Dlaczego potrzeba PersonBuilderzajęć?
Jedyną korzyścią, jaką widzę, jest to, że możemy zadeklarować Personpola jako final, zapewniając w ten sposób niezmienność.
withNamezwrócić kopię Osoby ze zmienionym tylko polem nazwiska. Innymi słowy, Person john = new Person().withName("John");może działać, nawet jeśli Personjest niezmienny (i jest to powszechny wzorzec w programowaniu funkcjonalnym).
voidmetod. Na przykład, jeśli Personma metodę, która wypisuje ich nazwę, nadal możesz połączyć ją w płynny interfejs person.setName("Alice").sayName().setName("Bob").sayName(). Nawiasem mówiąc, adnotuję te w JavaDoc z dokładnie twoją sugestią @return Fluent interface- jest to ogólne i wystarczająco jasne, gdy stosuje się do dowolnej metody, która robi to return thispod koniec jej wykonywania i jest dość jasne. Konstruktor będzie więc również płynnie posługiwał się interfejsem.
chainable setters: D