定义:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
使用场景:构建复杂的产品时,产品的各个组成部分可能发生变化,但产品组合起来具有一定的规律,通过导演者(Director)来将产品的各个部分组合,指导整个生产过程。
与工厂模式的区别:建造者模式中的建造者相当于工厂模式,但多出来了一个导演者(Director),他相当于工厂里来了个牛逼的工程指导者,这样就使工厂能更灵活的生产出产品。也可以举例为:工厂模式是演员的自导自演,然后给观众(客户端client)表演,而建造者模式多了个导演,来给观众编排节目。
- Product:要建造的产品。
- Builder:抽象建造者,相当于工厂模式中的抽象工厂接口或抽象类,它不具体制造产品,而是定义产品由哪些部分需要建造,以及各部分需要建造什么。
- ConCreator:具体建造者,它负责具体的实现Builder所定义的各个部分的具体建造。
- Director:导演者或者叫指导者,它负责指导具体建造者,按着固定的方式或者一定的顺序去建造产品。
- -
举个栗子:建造美女与野兽的脸部。
产品:
//脸部
public class Face {
private Eye eye;
private Nose nose;
private Mouth mouth;
public Eye getEye() {
return eye;
}
public void setEye(Eye eye) {
this.eye = eye;
}
public Nose getNose() {
return nose;
}
public void setNose(Nose nose) {
this.nose = nose;
}
public Mouth getMouth() {
return mouth;
}
public void setMouth(Mouth mouth) {
this.mouth = mouth;
}
}
//眼睛
public class Eye {
private String type;
Eye(String t){
type = t;
}
public void info(){
System.out.println(type);
}
}
//鼻子
public class Nose {
private String type;
Nose(String t){
type = t;
}
public void info(){
System.out.println(type);
}
}
//嘴巴
public class Mouth {
private String type;
Mouth(String t){
type = t;
}
public void info(){
System.out.println(type);
}
}
抽象建造者:
//脸部建造者
public interface FaceBuilder {
void buildEye();
void buildNose();
void buildMouth();
Face getResult();
}
具体建造者:
//美女脸部建造者
public class BeautyFaceBuilder implements FaceBuilder{
private Face face = new Face();
@Override
public void buildEye() {
System.out.println("建造美女的眼镜");
face.setEye(new Eye("眼若丹凤"));
}
@Override
public void buildNose() {
System.out.println("建造美女的鼻子");
face.setNose(new Nose("鼻若琼瑶"));
}
@Override
public void buildMouth() {
System.out.println("建造美女的嘴巴");
face.setMouth(new Mouth("樱桃小口"));
}
@Override
public Face getResult() {
return face;
}
}
//野兽脸部建造者
public class BeastFaceBuilder implements FaceBuilder{
private Face face = new Face();
@Override
public void buildEye() {
System.out.println("建造野兽的眼睛");
face.setEye(new Eye("眼若铜铃"));
}
@Override
public void buildNose() {
System.out.println("建造野兽的鼻子");
face.setNose(new Nose("鼻孔朝天"));
}
@Override
public void buildMouth() {
System.out.println("建造野兽的嘴巴");
face.setMouth(new Mouth("血盆大口"));
}
@Override
public Face getResult() {
return face;
}
}
指导者:
public class FaceDirector {
public static void buildFace(FaceBuilder fb){
fb.buildEye();
fb.buildNose();
fb.buildMouth();
}
}
客户端:
public class ClientDemo {
public static void main(String[] args) {
System.out.println("------开始建造美女脸部------");
BeautyFaceBuilder beautyFaceBuilder = new BeautyFaceBuilder();
FaceDirector.buildFace(beautyFaceBuilder);
Face beautyFace = beautyFaceBuilder.getResult();
beautyFace.getEye().info();
beautyFace.getNose().info();
beautyFace.getMouth().info();
System.out.println("------开始建造野兽脸部------");
BeastFaceBuilder beastFaceBuilder = new BeastFaceBuilder();
FaceDirector.buildFace(beastFaceBuilder);
Face beastface = beastFaceBuilder.getResult();
beastface.getEye().info();
beastface.getNose().info();
beastface.getMouth().info();
}
}
运行结果:
------开始建造美女脸部------
建造美女的眼镜
建造美女的鼻子
建造美女的嘴巴
眼若丹凤
鼻若琼瑶
樱桃小口
------开始建造野兽脸部------
建造野兽的眼睛
建造野兽的鼻子
建造野兽的嘴巴
眼若铜铃
鼻孔朝天
血盆大口