1.定义
建造者模式(Builder)用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
2.结构
2.1 UML类图
2.2 角色
- 产品(Product)角色:包含多个组成部件的复杂对象,由具体建造者来创建其各个部件。
- 建造者(Builder)角色:定义生成实例所需要的所有方法;
- 具体的建造者(ConcreteBuilder)角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
- 指挥者(Director)角色:定义使用建造者角色中的方法来生成实例的方法;
3.实现
/**
* Product角色
*/
class House {
private String floor;
private String wall;
private String roof;
public void setFloor(String floor) {
this.floor = floor;
}
public void setWall(String wall) {
this.wall = wall;
}
public void setRoof(String roof) {
this.roof = roof;
}
@Override
public String toString() {
return "House {" +
"floor='" + floor + '\'' +
", wall='" + wall + '\'' +
", roof='" + roof + '\'' +
'}';
}
}
interface Builder {
void buildFloor();
void buildWall();
void buildRoof();
}
class ApartmentBuilder implements Builder{
private House house;
public ApartmentBuilder(House house) {
this.house = house;
}
@Override
public void buildFloor() {
house.setFloor("公寓的地面已建");
}
@Override
public void buildWall() {
house.setWall("公寓的墙已建");
}
@Override
public void buildRoof() {
house.setRoof("公寓的屋顶已建");
}
}
class HouseDirector {
private Builder house;
public HouseDirector(Builder house) {
this.house = house;
}
/**
* 盖房子
*/
public void buildeHouse() {
house.buildFloor();
house.buildWall();
house.buildRoof();
}
}
public class BuilderDemo {
public static void main(String[] args) {
House house = new House();
System.out.println("建造前:" + house);
ApartmentBuilder apartmentBuilder = new ApartmentBuilder(house);
HouseDirector director = new HouseDirector(apartmentBuilder);
director.buildeHouse();
System.out.println("建造后:" + house);
}
}
4.优缺点
4.1 优点
- 易扩展,增加新的具体建造者无需修改原有类库的代码,符合“开闭原则“。
- 产品的建造和表示分离,易于解耦,可以使用相同的创建过程来得到不同的产品。
4.2 缺点
- 建造者模式所创建的产品需要具有共同点,如果产品之间的差异性很大,则不适合使用建造者模式,使用范围有限制。
- 若产品的内部变化复杂,就需要更多的建造者类,难以维护。
本人才疏学浅,若有错,请指出,谢谢!
如果你有更好的建议,可以留言我们一起讨论,共同进步!
衷心的感谢您能耐心的读完本篇博文!