I would use builder pattern when the object is complex and has lot of attributes. Builder pattern helps to create objects with different initialization attributes quickly. Imagine having an class with 10 attributes and every time you have to initialize all the 10 attributes. With Builder you can have default values for few attributes so that you don't have to initialize all the attributes every time.
Example:
public class AnimalBuillder {
private String category = "Domestic" // default initialization
private String type;
private String name;
AnimalBuilder withCategory(String category) {
this.category = category;
return this;
}
AnimalBuilder withName(String name) {
this.name = name;
return this;
}
AnimalBuilder withType(String type) {
this.name = name;
return this;
}
Animal build() {
return new Animal(name, type, category);
}
}
Usage would be:
new AnimalBuilder().withType("cat").withName("meow").build();
OR
new AnimalBuilder().withCategory("wild").withType("cat").withName("meow").build();
depending on how well you provide default initialization you can create objects with different attributes quickly with very few chain methods using a builder.