建造者模式
一个复杂的构建与其表示相分离
对象内部属性本身相互依赖
与不可变对象配合使用
方式一
public class BuilderTest {
public static void main(String[] args) {
UserBuilder userBuilder = new DefaultUserBuilder();
Director director = new Director(userBuilder);
User user = director.makeUser("1", "小明", "18", "男");
System.out.println(user);
//只需要重构建造者就行
UserBuilder userBuilder1 = new VipUserBuilder();
}
}
interface UserBuilder {
void buildId(String id);
void buildName(String name);
void buildAge(String age);
void buildGender(String gender);
User build();
}
/**
* 默认建造者
*/
class DefaultUserBuilder implements UserBuilder {
private String id;
private String name;
private String age;
private String gender;
@Override
public void buildId(String id) {
this.id = id;
}
@Override
public void buildName(String name) {
this.name = name;
}
@Override
public void buildAge(String age) {
this.age = age;
}
@Override
public void buildGender(String gender) {
this.gender = gender;
}
@Override
public User build() {
return new User(id, name, age, gender);
}
}
/**
* VIP建造者
*/
class VipUserBuilder implements UserBuilder {
private String id;
private String name;
private String age;
private String gender;
@Override
public void buildId(String id) {
this.id = id;
}
@Override
public void buildName(String name) {
this.name = name;
}
@Override
public void buildAge(String age) {
this.age = age;
}
@Override
public void buildGender(String gender) {
this.gender = gender;
}
@Override
public User build() {
return new User(id, name, age, gender);
}
}
class Director {
private UserBuilder userBuilder;
public Director(UserBuilder userBuilder) {
this.userBuilder = userBuilder;
}
public User makeUser(String id, String name, String age, String gender) {
userBuilder.buildId(id);
userBuilder.buildName(name);
userBuilder.buildAge(age);
userBuilder.buildGender(gender);
return userBuilder.build();
}
}
class User {
private String id;
private String name;
private String age;
private String gender;
public User(String id, String name, String age, String gender) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age='" + age + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
方式二
public class BuilderPattern {
private final String id;
private final String name;
private final String param1;
private final String param2;
public BuilderPattern(String id, String name, String param1, String param2) {
this.id = id;
this.name = name;
this.param1 = param1;
this.param2 = param2;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getParam1() {
return param1;
}
public String getParam2() {
return param2;
}
@Override
public String toString() {
return "BuilderPattern{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", param1='" + param1 + '\'' +
", param2='" + param2 + '\'' +
'}';
}
interface Builder {
Builder buildId(String id);
Builder buildName(String name);
Builder buildParam1(String param1);
Builder buildParam2(String param2);
BuilderPattern build();
}
/**
* 默认建造者
*/
static class DefaultBuilder implements Builder {
private String id;
private String name;
private String param1;
private String param2;
@Override
public Builder buildId(String id) {
this.id = id;
return this;
}
@Override
public Builder buildName(String name) {
this.name = name;
return this;
}
@Override
public Builder buildParam1(String param1) {
this.param1 = param1;
return this;
}
@Override
public Builder buildParam2(String param2) {
this.param2 = param2;
return this;
}
@Override
public BuilderPattern build() {
return new BuilderPattern(this.id, this.name, this.param1, this.param2);
}
}
/**
* 自定义建造者(拓展)
*/
static class CustomBuilder implements Builder {
private String id;
private String name;
private String param1;
private String param2;
@Override
public Builder buildId(String id) {
this.id = id + "Custom";
return this;
}
@Override
public Builder buildName(String name) {
this.name = name + "Custom";
return this;
}
@Override
public Builder buildParam1(String param1) {
this.param1 = param1 + "Custom";
return this;
}
@Override
public Builder buildParam2(String param2) {
this.param2 = param2 + "Custom";
return this;
}
@Override
public BuilderPattern build() {
return new BuilderPattern(this.id, this.name, this.param1, this.param2);
}
}
public static void main(String[] args) {
Builder defaultBuilder = new DefaultBuilder();
defaultBuilder.buildId("123");
defaultBuilder.buildName("小明");
defaultBuilder.buildParam1("aaa");
defaultBuilder.buildParam2("bbb");
BuilderPattern builderPattern = defaultBuilder.build();
System.out.println(builderPattern);
Builder defaultBuilder2 = new CustomBuilder();
defaultBuilder2.buildId("456");
defaultBuilder2.buildName("小黑");
defaultBuilder2.buildParam1("ccc");
defaultBuilder2.buildParam2("dddd");
BuilderPattern builderPattern2 = defaultBuilder2.build();
System.out.println(builderPattern2);
}
}