概念:给出一个接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。用户只需指定需要建造的类型就可以获得对象,建造过程及细节不需要了解。
应用场景:
- 需要生成的对象具有复杂的内部结构
- 需要生成的对象内部属性本身相互依赖,但是步骤的顺序不一定固定
- 把复杂对象的创建和使用分离
优点:
- 封装性好,创建和使用分离。
- 扩展性好,建造类之间独立、一定程度上解耦。
缺点:
- 产生多余的Builder对象。
- 产品内部发生变化,建造都要修改,成本较大。
与工厂模式的区别:
- 建造者模式更加关注于零部件装配的顺序;工厂模式注重于创建对象。
- 创建对象的力度不同,创建者模式创建复杂对象,由各种复杂的部件组成,工厂模式创建出来的都一样。
- 关注点:工厂模式只需要把对象创建出来就可以了,而建造者模式中不仅要创建出这个对象,还要知道这个对象由哪些部件组成。
- 建造者模式根据建造过程中的顺序不一样,最终的对象部件组成也不一样。
实例:
public class Person {
private String head;
private String body;
private String foot;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
}
public interface PersonBuilder {
void builderHead();
void builderBody();
void builderFoot();
Person builderPerson();
}
public class ManBuilder implements PersonBuilder {
private Person person;
public ManBuilder() {
person = new Person();
}
public void builderHead() {
person.setHead("头:美国人鼻子尖蓝眼睛");
}
public void builderBody() {
person.setBody("身体:块头大");
}
public void builderFoot() {
person.setFoot("尾:腿长");
}
public Person builderPerson() {
return person;
}
}
public class PersonDirector {
public Person createPerson(PersonBuilder personBuilder) {
personBuilder.builderHead();
personBuilder.builderBody();
personBuilder.builderFoot();
return personBuilder.builderPerson();
}
public static void main(String[] args) {
PersonDirector personDirector = new PersonDirector();
Person person = personDirector.createPerson(new ManBuilder());
System.out.println(person.getHead() + person.getBody() + person.getFoot());
}
}
通过上述代码,可以看出,其实就是将目标对象拆解成各个部分,通过一个接口抽象出需要创建哪些部分,最后通过这个接口的实现类,给各个部分赋值,并返回完整的目标对象。举个例子,就相当于网络游戏里的装备栏,个人装备有头盔,衣服,裤子,武器等等,将这些部分通过一个建造者把他们组装成一个整体。