文章目录
- 建造者模式
- 建造者模式的角色
- 案例
- 代码
- 定义产品
- 定义抽象建造者以及具体建造者
- 定义指挥者
- 客户端使用
- 输出结果
建造者模式
建造者模式属于创造型的模式,用于创建复杂对象,将创建复杂对象的逻辑与对象本身表示分离出来,比如宝马这个产品,需要构建方向盘,轮胎,后备箱等等复杂逻辑操作,就可以使用建造者模式。
建造者主要是想把复杂对象的建造过程以及对象本身表达分离出来。将变化的代码从不变的代码中分离出来,起到代码的复用性。
实际案例:StringBuild 的源码
建造者模式的角色
- 具体产品:一个具体产品的表示
- 抽象建造:定义产品建造过程中相关的方法,
- 具体建造:实现抽象建造,定义产品具体的建造。
- 指挥者:用于建造对象,提供对象的返回,关注于产品建造的顺序,不关注产品的具体建造。
案例
代码
定义产品
/**
* 产品
*
* @author: Hui
**/
@Data
public class House {
private String bisic;
private String wall;
private String roof;
}
定义抽象建造者以及具体建造者
/**
* 抽象建造者
*
* @author: Hui
**/
public abstract class HouseBuild {
private House house = new House();
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void roofed();
public House buildHouse(){
return house;
}
}
/**
* 具体建造者:普通房子
*
* @author: Hui
**/
public class CommonHouse extends HouseBuild {
@Override
public void buildBasic() {
System.out.println(" 普通房子打地基 5 米 ");
}
@Override
public void buildWalls() {
System.out.println(" 普通房子砌墙 10cm ");
}
@Override
public void roofed() {
System.out.println(" 普通房子封顶 ");
}
}
package build;
/**
* 具体建造者:高楼
*
* @author: Hui
**/
public class HighHouse extends HouseBuild{
@Override
public void buildBasic() {
System.out.println(" 高楼打地基 100 米 ");
}
@Override
public void buildWalls() {
System.out.println(" 高楼砌墙 ");
}
@Override
public void roofed() {
System.out.println(" 高楼封顶-透明顶 ");
}
}
定义指挥者
/**
* 指挥者:用于返回创建对象,设置对象创建的顺序
*
* @author: Hui
**/
public class HouseDirector {
//聚合抽象建造者
private HouseBuild houseBuild;
//使用构造方法来设置抽象建造者
public HouseDirector(HouseBuild houseBuild){
this.houseBuild = houseBuild;
}
//使用 set 方法来设置抽象建造者
public void setHouseBuild(HouseBuild houseBuild){
this.houseBuild = houseBuild;
}
//提供返回产品对象的方法。
public House buildHouse(){
houseBuild.buildBasic();
houseBuild.buildWalls();
houseBuild.roofed();
return houseBuild.buildHouse();
}
客户端使用
/**
* 客户端
*
* @author: Hui
**/
public class Client {
public static void main(String[] args) {
//建造普通房子
System.out.println("建造普通房子");
HouseDirector houseDirector = new HouseDirector(new CommonHouse());
House house = houseDirector.buildHouse();
// System.out.println(house);
System.out.println("------------------------------");
//建造高楼
System.out.println("建造高楼");
houseDirector.setHouseBuild(new HighHouse());
House house1 = houseDirector.buildHouse();
// System.out.println(house1);
}
}
输出结果
d(new HighHouse());
House house1 = houseDirector.buildHouse();
// System.out.println(house1);
}
}
### 输出结果
[外链图片转存中...(img-fqB3aKVI-1720330094469)]