设计模式(十五)——建造者模式(Builder)
使用多个简单的对象一步一步构建成一个复杂的对象。
建造者模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
应用场景
java中StringBuilder类
优点
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示,建造者独立,易扩展。
实现
实现一个People类的创建,现在的People类的属性还很少,看不出来建造者模式的优点,当实体类的属性很多,属性的结构和创建复杂时,就可以体会到建造者模式的优点。
public class People {
private int age;
private String Name;
private String sex;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "People{" +
"age=" + age +
", Name='" + Name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
PeopleBuilder接口,所有的属性都有一个Builder方法,注意这里的返回类型是PeopleBuilder,方便链式编程。getPeople()用于获取实体类。
public interface PeopleBuilder {
public PeopleBuilder nameBuilder();
public PeopleBuilder sexBuilder();
public PeopleBuilder ageBuilder();
public People getPeople();
}
实现PeopleBuilder接口,重写方法,在属性的builder方法里面加入属性值即可。想要增加新的实例化对象时就新创建类,然后实现PeopleBuilder方法。
public class PeopleBuilderA implements PeopleBuilder{
private People people = new People();
@Override
public PeopleBuilder nameBuilder() {
people.setName("zhangsan");
return this;
}
@Override
public PeopleBuilder sexBuilder() {
people.setSex("男");
return this;
}
@Override
public PeopleBuilder ageBuilder() {
people.setAge(18);
return this;
}
@Override
public People getPeople() {
this.nameBuilder().sexBuilder().ageBuilder();
return people;
}
}
调用
public class Main {
public static void main(String[] args) {
People people = new PeopleBuilderA().getPeople();
System.out.println(people);
}
}
运行结果
上面这种方法每次想要新的对象时,得重新创建类,另一种较简单的写法:
public class PeopleEasyBuilder {
People people = new People();
public PeopleEasyBuilder nameBuilder(String name) {
people.setName(name);
return this;
}
public PeopleEasyBuilder sexBuilder(String sex) {
people.setSex(sex);
return this;
}
public PeopleEasyBuilder ageBuilder(int age) {
people.setAge(age);
return this;
}
public People getPeople() {
return people;
}
}
People people1 = new PeopleEasyBuilder().nameBuilder("wangwu").sexBuilder("女").ageBuilder(25).getPeople();
System.out.println(people1);