分离了对象组建的单独构造,从而可以构造出复杂的对象,这个模式造用于:某个对象的构建过程复杂的情况下使用。
由于实现了构造和装配的解耦。不同的构造器,相同的装配,也可以做出不同的对象;相同的构造器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配逄法的解耦,实现了更好的复用。
建造班级,创建学生与老师两个类
publicclass Student {
private String name;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicvoid info(){
System.out.println("sayHi!");
}
}
publicclass Teacher {
private String name;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicvoid info(){
System.out.println("sayHello!");
}
}
publicclass TheClass {
private Student student;
private Teacher teacher;
public Student getStudent() {
returnstudent;
}
publicvoid setStudent(Student student) {
this.student = student;
}
public Teacher getTeacher() {
returnteacher;
}
publicvoid setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
publicinterface IInstanceBulider {
public Student buliderStudent();
public Teacher buliderTeacher();
}
class InstanceBulider implements IInstanceBulider{
@Override
public Student buliderStudent() {
returnnew Student();
}
@Override
public Teacher buliderTeacher() {
returnnew Teacher();
}
}
装配接口与装配类
//装配接口、装配班级方法。
publicinterface buliderTheClass {
public TheClass createTheClass();
}
//装配实现、实现装配班级方法
class InstanceClass implements buliderTheClass{
//调用工厂
private InstanceBulider ib;
public InstanceClass(InstanceBulider ib){
this.ib = ib;
}
//进行装配、返回班级。
@Override
public TheClass createTheClass() {
Student stu = ib.buliderStudent();
Teacher th = ib.buliderTeacher();
TheClass tc = new TheClass();
tc.setStudent(stu);
tc.setTeacher(th);
return tc;
}
}
publicclass Main {
publicstaticvoid main(String[] args) {
InstanceClass ic = new InstanceClass(new InstanceBulider());
TheClass tc = ic.createTheClass();
tc.getStudent().info();
tc.getTeacher().info();
}
}
输出结果:
sayHi!
sayHello!
开发中应用场景:
StringBuilder类的append方法
SQL中的PrearedStatement
JOM中、DomBuilder、SAXBuilder
publicclass Factory {
publicstatic Object getInstance(String className){
Object obj;
try {
obj = Class.forName(className).newInstance();
return obj;
} catch (Exception e) {
e.printStackTrace();
}
returnnull;
}
}