對於基本類型,生成器模式似乎非常簡單。我想了解它是如何工作的,當你想建立一個複雜的成員類型的對象。涉及複雜對象的生成器模式
這裏我有一個Person類和一個靜態內部類來構建Person。我有一個我在PersonBuilder靜態嵌套類中定義的地址類。理想情況下,地址類應該在Person類中定義。代碼的作品,但我不知道如果我在這裏正確做事。任何人都可以請建議是否有更好的方法來構造這些類型的對象。
class Person{
private String firstName;
private String lastName;
private Integer age;
private Person.PersonBuilder.Address address;
private Person(PersonBuilder builder){
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.address = builder.address;
}
@Override
public String toString(){
return "Person: " +
this.firstName + "|" +
this.lastName + "|" +
this.age.toString() + "|" +
this.address.aptNum + "|" +
this.address.street + "|" +
this.address.city + "|" +
this.address.state + "|" +
this.address.zipCode;
}
public static class PersonBuilder{
private String firstName;
private String lastName;
private Integer age;
private Address address;
private class Address{
private String aptNum;
private String street;
private String city;
private String state;
private Long zipCode;
public Address(String aptNum, String street, String city, String state, Long zipCode) {
this.aptNum = aptNum;
this.street = street;
this.city = city;
this.state = state;
this.zipCode = zipCode;
}
}
public PersonBuilder(String firstName, String lastName){
this.firstName = firstName;
this.lastName = lastName;
this.address = this.new Address("", "", "", "", 0L);
}
public PersonBuilder age(Integer age){
this.age = age;
return this;
}
public PersonBuilder buildAddress(String aptNum, String street, String city, String state, Long zipCode){
this.address = new Address(aptNum, street, city, state, zipCode);
return this;
}
public Person build(){
return new Person(this);
}
}
}
class Demo {
public static void main(String[] args){
Person p1 = new Person.PersonBuilder("XYZ", "XYZ")
.age(24)
.buildAddress("AB", "XYZ Lane", "ABCtown",
"XY", 1234L)
.build();
System.out.println(p1.toString());
}
}