应用场景
- 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
划重点:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
1. 首先定义一个最终要建造的产品(Product)
public class Human {
private String name;
private String sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
}
2.其次是建造者的公共接口,包括建造的方法以及返回产品的方法 (Builder)
public interface Builder {
void buildName();
void buildSex();
void buildAge();
Human createHuman();
}
3.具体建造逻辑的实现 (ConcreteBuilder)
public class StudentBuilder implements Builder{
private Human human;
public StudentBuilder() {
this.human = new Human();
}
@Override
public void buildName() {
human.setName("student");
}
@Override
public void buildSex() {
human.setSex("man");
}
@Override
public void buildAge() {
human.setAge(15);
}
@Override
public Human createHuman() {
return this.human;
}
}
public class TeacherBuilder implements Builder{
private Human human;
public TeacherBuilder() {
this.human = new Human();
}
@Override
public void buildName() {
human.setName("teacher");
}
@Override
public void buildSex() {
human.setSex("woman");
}
@Override
public void buildAge() {
human.setAge(25);
}
@Override
public Human createHuman() {
return this.human;
}
}
4.指挥者 负责产品的生产过程&&隔离了客户与对象的生产过程(Director)
(只是组装一下步骤而已,具体的生产细节在第三步实现)
public class Director {
public Human buildHuman(Builder builder){
builder.buildName();
builder.buildSex();
builder.buildAge();
return builder.createHuman();
}
}
5.测试两个不同的Builder实现类,这样可以获得我们需要的产品Human,至于那些繁琐的细节,who cares!!!
public class TestBuild {
public static void main(String[] args) {
Director director = new Director();
Human buildStudent = director.buildHuman(new StudentBuilder());
System.out.println(buildStudent.toString());
Human buildTeacher = director.buildHuman(new TeacherBuilder());
System.out.println(buildTeacher.toString());
}
}