• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

RomanLin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【设计模式与体系结构】创建型模式-建造者模式

简介

建造者模式指的是将一个复杂对象的创建与表示分离,使得同样的创建过程可以创建不同的表示,分离了部件的构造(由 Builder 负责)和装配(由 Director 负责)。从而可以构造出复杂的对象,这个模式适用于某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦,不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序。亦即实现构建算法和装配算法的解耦,实现更好的复用。用户只需要指定复杂对象的类型,而无需知晓其内部构造细节。

建造者模式的角色

  1. 抽象建造者(Builder)类:定义一套抽象的构建方法接口
  2. 具体建造者(Concrete Builder)类:实现Builder接口,完成复杂产品的每个部件的具体创建方法。在构建过程完成后,提供产品的实例
  3. 产品(Product)类:具体创建者要创建的复杂对象
  4. 指挥者(Director)类:调用具体建造者来建造产品的各个部分,在指挥者中不涉及具体产品的信息,只保证对象的各部分完整创建或按某个顺序创建

建造者模式的优点

  1. 建造者模式的封装性好,使用建造者模式可以有效地封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的。因此,将主要的业务逻辑封装在指挥者类中,会具有较好的稳定性
  2. 客户不必知晓产品内部的实现细节。将产品的表示与产品的创建过程解耦,使得相同的创建过程,也可以创建不同的产品,也可以通过控制创建的顺序,来创建不同的产品
  3. 可以将产品的创建过程精细化,使得业务逻辑更加清晰
  4. 创建者模式可扩展性好。当有新的业务需求时,仅需要实现一个新的具体建造者类即可,无需更改原有代码,因此符合开闭原则

建造者模式的缺点

  1. 仅适用于产品类差异较小的情景

建造者模式的类图

正文

Vehicle 类是一个产品类,实际写为一个实体类即可,代码如下:

public class Vehicle {
    private String frame;//框架
    private String power;//能源

    public String getPower() {
        return power;
    }

    public void setPower(String power) {
        this.power = power;
    }

    public String getFrame() {
        return frame;
    }

    public void setFrame(String frame) {
        this.frame = frame;
    }
}

抽象建造者类 VehicleBuilder 代码如下:

public abstract class VehicleBuilder {
    protected Vehicle vehicle = new Vehicle();
    abstract void buildFrame(String frame);
    abstract void buildPower(String power);
}

具体建造者 NewEnergyVehicleBuilder 代码如下:

public class NewEnergyVehicleBuilder extends VehicleBuilder {
    @Override
    void buildFrame(String frame) {
        vehicle.setFrame(frame);
    }

    @Override
    void buildPower(String power) {
        vehicle.setPower(power);
    }
}

具体建造者 GasolineVehicleBuilder 代码如下:

public class GasolineVehicleBuilder extends VehicleBuilder {
    @Override
    void buildFrame(String frame) {
        vehicle.setFrame(frame);
    }

    @Override
    void buildPower(String power) {
        vehicle.setPower(power);
    }
}

指挥者 VehicleDirector 代码如下:

public class VehicleDirector {
    private VehicleBuilder builder;
    
    public VehicleDirector(VehicleBuilder builder) {
        this.builder = builder;
    }
    
    public Vehicle construct(String frame, String power) {
        builder.buildFrame(frame);
        builder.buildPower(power);
        return builder.vehicle;
    }
}

客户端代码如下:

private void testBuilderPattern() {
    VehicleBuilder builder = new GasolineVehicleBuilder();
    VehicleDirector vehicleDirector = new VehicleDirector(builder);
    Vehicle vehicle = vehicleDirector.construct("铝合金车架", "汽油");
    Log.i("BuilderPattern", "车架:" + vehicle.getFrame() + " 能源:" + vehicle.getPower());
    builder = new NewEnergyVehicleBuilder();
    vehicleDirector = new VehicleDirector(builder);
    vehicle = vehicleDirector.construct("碳纤维车架", "新能源电池");
    Log.i("BuilderPattern", "车架:" + vehicle.getFrame() + " 能源:" + vehicle.getPower());
}

运行效果如下:

posted on 2024-12-28 21:49  RomanLin  阅读(47)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3