建造者模式
定义: 将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成不同复杂对象
优点:
-
建造者独立,易扩展。
-
便于控制细节风险。
缺点:
-
产品必须有共同点,范围有限制
-
内部变化复杂,就会有很多的建造类
使用场景: -
对象具有复杂的内部结构
-
对象内部属性本身相互依赖
角色
- Builder:为创建一个产品对象的各个部件指定抽象接口
- ConcreteBuilder:实现了 Builder 接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
- Product:被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
- Director:构造一个使用 Builder 接口的对象,指导构建过程
使用实例
-
StringBuilder/StringBuffer 的 append() 方法
-
MyBatis 的 SqlSessionFactoryBuilder 返回 SqlSessionFactory
实现
产品类 Product
/**
* 产品类
*/
@Data
public class MobilePhone {
// 品牌
private String brand;
// 系统
private String system;
// 处理器
private String CPU;
// 屏幕
private String screen;
// 摄像头
private String camera;
}
抽象产品建造者 Builder
/**
* 抽象建造者
*/
public abstract class Builder {
MobilePhone mobilePhone = new MobilePhone();
public abstract void buildBrand();
public abstract void buildSystem();
public abstract void buildCPU();
public abstract void buildScreen();
public abstract void buildCamera();
public MobilePhone createMobilePhone() {
return mobilePhone;
}
}
具体产品建造者
/**
* 具体建造者
*/
public class HuaweiBuilder extends Builder {
@Override
public void buildBrand() {
mobilePhone.setBrand("Huawei");
}
@Override
public void buildSystem() {
mobilePhone.setSystem("Harmony OS");
}
@Override
public void buildCPU() {
mobilePhone.setCPU("麒麟9000");
}
@Override
public void buildScreen() {
mobilePhone.setScreen("华星");
}
@Override
public void buildCamera() {
mobilePhone.setCamera("莱卡");
}
}
/**
* 具体产品建造者
*/
public class XiaoMiBuilder extends Builder{
@Override
public void buildBrand() {
mobilePhone.setBrand("XiaoMi");
}
@Override
public void buildSystem() {
mobilePhone.setSystem("Android");
}
@Override
public void buildCPU() {
mobilePhone.setCPU("火龙888");
}
@Override
public void buildScreen() {
mobilePhone.setScreen("Samsung");
}
@Override
public void buildCamera() {
mobilePhone.setCamera("Samsung");
}
}
构建过程指导者 Director
/**
* 指导构建过程
*/
public class Director {
public MobilePhone construct(Builder builder) {
builder.buildBrand();
builder.buildCamera();
builder.buildCPU();
builder.buildScreen();
builder.buildSystem();
MobilePhone mobilePhone = builder.createMobilePhone();
return mobilePhone;
}
}
测试类
public class Test {
public static void main(String[] args) {
Director director = new Director();
Builder huaweiBuilder = new HuaweiBuilder();
MobilePhone huaweiMobilePhone = director.construct(huaweiBuilder);
System.out.println(huaweiMobilePhone.toString());
Builder xiaoMiBuilder = new XiaoMiBuilder();
MobilePhone xiaoMiMobilePhone = director.construct(xiaoMiBuilder);
System.out.println(xiaoMiMobilePhone.toString());
}
}
// --------------------测试结果--------------------
// MobilePhone(brand=Huawei, system=Harmony OS, CPU=麒麟9000, screen=华星, camera=莱卡)
// MobilePhone(brand=XiaoMi, system=Android, CPU=火龙888, screen=Samsung, camera=Samsung)