-
Notifications
You must be signed in to change notification settings - Fork 1
/
BuilderFacets.java
103 lines (86 loc) · 2.64 KB
/
BuilderFacets.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package creational.builder.facets;
class Person {
// address
public String streetAddress, postcode, city;
// employment
public String companyName, position;
public int annualIncome;
@Override
public String toString() {
return "Person{" +
"streetAddress='" + streetAddress + '\'' +
", postcode='" + postcode + '\'' +
", city='" + city + '\'' +
", companyName='" + companyName + '\'' +
", position='" + position + '\'' +
", annualIncome=" + annualIncome +
'}';
}
}
// builder facade
class PersonBuilder {
protected Person person = new Person();
// Implementing the PersonAddressBuilder below
public PersonAddressBuilder lives() {
return new PersonAddressBuilder(person);
}
// Implementing the PersonJobBuilder below
public PersonJobBuilder works() {
return new PersonJobBuilder(person);
}
public Person build() {
return person;
}
}
/* The reason the subbuilders extend PersonBuilder allows one to
alternate between builder methods freely. See the demo below! */
class PersonAddressBuilder extends PersonBuilder {
public PersonAddressBuilder(Person person) {
this.person = person;
}
public PersonAddressBuilder at(String streetAddress) {
person.streetAddress = streetAddress;
return this;
}
public PersonAddressBuilder withPostcode(String postcode) {
person.postcode = postcode;
return this;
}
public PersonAddressBuilder in(String city) {
person.city = city;
return this;
}
}
class PersonJobBuilder extends PersonBuilder {
public PersonJobBuilder(Person person) {
this.person = person;
}
public PersonJobBuilder at(String companyName) {
person.companyName = companyName;
return this;
}
public PersonJobBuilder asA(String position) {
person.position = position;
return this;
}
public PersonJobBuilder earning(int annualIncome) {
person.annualIncome = annualIncome;
return this;
}
}
class BuilderFacetsDemo {
public static void main(String[] args) {
PersonBuilder pb = new PersonBuilder();
Person person = pb
.lives() // exposing the address builder!!!
.at("123 London Road")
.in("London")
.withPostcode("SW12BC")
.works() // exposing the job builder here!!
.at("Fabrikam")
.asA("Engineer")
.earning(123000)
.build();
System.out.println(person);
}
}