定义
将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示
结构图
角色与理解
- 建造者模式主要包含如下几个角色:
-
- Builder(抽象建造者):构建产品对象部件方法的抽象接口,可以是接口也可以是抽象类,供指挥者使用;方法包含两类bulidX()与getResult()方法
- ConcreteBuilder(具体建造者):实现抽象建造者接口,一个具体建造者对应一中具体的产品对象
- Product(产品角色):建造者模式最终产物
- Director(指挥者):又称为导演类,它负责安排产品对象的各个部件的建造顺序
- 抽象建造者提供抽象建造部件方法,具体建造者实现这些抽象方法,指挥者调用这些抽象方法,完成构建同样构建过程但是不同实现的对象的建造
- 建造者模式与抽象工厂模式的区别是前者是建造一个完整的复杂产品,而后者是一系列产品,前者像汽车组装厂,后者像汽车配件生产厂
核心代码
- 产品
@Getter
@Setter
public class Actor {
private String type; //角色类型
private String sex; //性别
private String face; //脸型
private String costume; //服装
private String hairstyle; //发型
}
- 抽象建造者
public abstract class ActorBuilder {
protected Actor actor = new Actor();
public abstract void buildType();
public abstract void buildSex();
public abstract void buildFace();
public abstract void buildCostume();
public abstract void buildHairstyle();
public Actor createActor() {
return actor;
}
}
- 具体建造者
public class AngelBuilder extends ActorBuilder {
@Override
public void buildType() {
actor.setType("天使");
}
@Override
public void buildSex() {
actor.setSex("女");
}
@Override
public void buildFace() {
actor.setFace("美人");
}
@Override
public void buildCostume() {
actor.setCostume("白裙");
}
@Override
public void buildHairstyle() {
actor.setHairstyle("披头散发");
}
}
- 指挥者
public class ActorController {
public Actor construct(ActorBuilder actorBuilder) {
Actor actor;
actorBuilder.buildType();
actorBuilder.buildSex();
actorBuilder.buildFace();
actorBuilder.buildCostume();
actorBuilder.buildHairstyle();
actor = actorBuilder.createActor();
return actor;
}
}
- 客户端
public class Client {
public static void main(String[] args) {
ActorBuilder actorBuilder = new AngelBuilder();
ActorController actorController = new ActorController();
Actor actor = actorController.construct(actorBuilder);
System.out.println(actor.getType());
System.out.println(actor.getSex());
System.out.println(actor.getFace());
System.out.println(actor.getCostume());
System.out.println(actor.getHairstyle());
}
}