建造者模式中的4个角色:
- Product(产品类):要创建的对象。
- builder(抽象建造者):定义对象的创建过程方法。
- ConcreteBuilder(具体建造者):实现具体的方法,不同的创建者方法内部的代码不一样, 从而可以创建不同的对象。
- Director(指导者):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
简单说: 具体产品定义好产品由那些部分组成,抽象建造者定义产品组成部分的实现方法, 具体建造者实现这些方法,最后返回建造好的对象(也是一个方法, 需要被调用),指导者负责调用建造者的方法,完成建造以后返回建造好的实例。
指导者遵循依赖倒置原则
,保证可扩展性。
具体案例如下: 我们模拟修建房子
//具体产品
class House{
//房子的组成 地基 墙 屋顶
private String foundation;//地基
private String wall;//墙
private String roof;//屋顶
public void setFoundation(String foundation) {
this.foundation = foundation;
System.out.println(foundation + "修建完成");
}
public void setWall(String wall) {
this.wall = wall;
System.out.println(wall + "修建完成");
}
public void setRoof(String roof) {
this.roof = roof;
System.out.println(roof + "修建完成");
}
}
//抽象建造者
interface IBuilder{
public void buildFoundation();
public void buildWall();
public void buildRoof();
public House getHouse();
}
//具体建造者 普通房子
class CommonHouseBuilder implements IBuilder{
private House house;
public CommonHouseBuilder() {
this.house = new House();
}
@Override
public void buildFoundation() {
house.setFoundation("普通房子的地基");
}
@Override
public void buildWall() {
house.setWall("普通房子的墙");
}
@Override
public void buildRoof() {
house.setRoof("普通房子的屋顶");
}
@Override
public House getHouse() {
System.out.println("修建完成, 交房成功!");
return this.house;
}
}
//指导者
class HouseDirector{
public House build(IBuilder builder){
builder.buildFoundation();
builder.buildWall();
builder.buildRoof();
return builder.getHouse();
}
}
主方法
public static void main(String[] args) throws CloneNotSupportedException {
HouseDirector houseDirector = new HouseDirector();
House build = houseDirector.build(new CommonHouseBuilder());
}
可扩展性: 我们如果想修一座别墅, 就定义一个别墅的具体建造者,然后在主方法中传给指导者即可, 保证了开闭原则