建造者模式

建造者模式

定义: 将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成不同复杂对象
优点:

  • 建造者独立,易扩展。

  • 便于控制细节风险。

缺点:

  • 产品必须有共同点,范围有限制

  • 内部变化复杂,就会有很多的建造类
    使用场景:

  • 对象具有复杂的内部结构

  • 对象内部属性本身相互依赖

角色

  • Builder:为创建一个产品对象的各个部件指定抽象接口
  • ConcreteBuilder:实现了 Builder 接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
  • Product:被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
  • Director:构造一个使用 Builder 接口的对象,指导构建过程

使用实例

  • StringBuilder/StringBuffer 的 append() 方法

  • MyBatis 的 SqlSessionFactoryBuilder 返回 SqlSessionFactory

实现

xx

产品类 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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值