定义
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
结构图
Director:指挥者,是构建一个使用Builder接口的对象。调用创建者来创建复杂对象的各个部分,在指导者不涉及具体产品的信息,只负责保证对象各部分完整创建或者按照某种顺序创建。
Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪一部分的创建,并不涉及具体的对象部件的创建。
ConcreteBuilder:实现Builder接口,针对不同的业务逻辑,具体化复杂对象的各个部分的创建。
Product:要创建的复杂对象。
我们可以看出建造者模式的适用条件(都满足):
1.建造过程复杂的对象
2.注重零件的装配顺序或者完整性,或者之后会更改顺序的需求。
3.产品的组件一般变更不太大,如果太大的话,Product和Builder等一列类都需要更改。
自己的理解:
建造者更强调的是,同一个流程下,实现的不同会产生不同的结果。将流程抽取出来成一个类,避免每次都重复写这套流程。将流程和实现分离开。
实例
这里以游戏开发中人物的构造过程为例。在游戏中创建一个形象时,需要对每个部位进行创建。简化而言,需要创建头部,身体和四肢。
类图:
PerDirector类:
public class PersonDirector {
public Person constructPerson(Builder builder){
builder.buildHead();
builder.buildBody();
builder.buildFoot();
return builder.buildPerson();
}
}
Builder类:
public abstract class Builder {
protected Person person;
public abstract void buildHead();
public abstract void buildBody();
public abstract void buildFoot();
public abstract Person buildPerson();
}
ConcreteBuilder类:
public class ConcreteBuilder extends Builder{
public ConcreteBuilder(){
person = new Person();
}
@Override
public void buildHead() {
person.setBody("小头");
}
@Override
public void buildBody() {
person.setBody("小身");
}
@Override
public void buildFoot() {
person.setFoot("小脚");
}
@Override
public Person buildPerson() {
System.out.println("创建成功");
return person;
}
}
实体类Person:
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;
}
}