建造者模式概念
是创建型模式之一,使用多个简单的对象创建一个复杂的对象,用于将一个复杂的构建与其表示分离,使得同样的构建过程可以创建不同的表示,然后通过一个Builder类创建最终对象。
建造者模式解决的问题
建造者模式主要用于解决软件系统中复杂对象的创建问题。例如复杂对象的创建通过各个部分的子对象用一定的算法构成,在需求变化时复杂对象面临大的改变,不利于系统的稳定,使用建造者将各个部分的算法包装起来,需求变化只需要将算法的顺序以及组合方式改变即可。
建造者模式需要的模块
Builder:创建一个复杂产品对象的抽象接口
ConcreteBuilder:Builder接口的实现类,用于定义复杂产品的各个部分的装配流程
Director:构造一个使用Builder接口的对象
Product:表示被构造的复杂对象,ConcreteBuilder定义了该复杂对象的装配流程,而Product定义了该复杂对象的结构和内部表示
类间关系图
Java实现
复杂产品房子
public class House {
private String baise;
private String wall;
private String roofed;
public String getBaise() {
return baise;
}
public void setBaise(String baise) {
this.baise = baise;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getRoofed() {
return roofed;
}
public void setRoofed(String roofed) {
this.roofed = roofed;
}
}
Builder类
//抽象建设者,主要用来指定建设步骤
public abstract class HouseBuilder {
protected House house = new House();
//建设房屋的基本方法,建设根基、建设墙、建设屋顶
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void roofed();
public House buildHouse() {
return house;
}
}
两个实现类
高楼大厦
public class HighBuilding extends HouseBuilder{
@Override
public void buildBasic() {
System.out.println("高楼地基");
}
@Override
public void buildWalls() {
System.out.println("高楼墙面");
}
@Override
public void roofed() {
System.out.println("高楼屋顶");
}
}
普通的房屋
public class CommonHouse extends HouseBuilder{
@Override
public void buildBasic() {
System.out.println("普通房子基地");
}
@Override
public void buildWalls() {
System.out.println("普通房子墙面");
}
@Override
public void roofed() {
System.out.println("普通房子屋顶");
}
}
Director类
//指挥者
public class HouseDirector {
HouseBuilder houseBuilder = null;
//构造器创建bilder对象
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//通过set方法设置对象属性
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//建造房屋的流程交给指挥者
public House constructHouse() {
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.roofed();
return houseBuilder.buildHouse();
}
}