23种设计模式6_建造者模式

本文详细介绍了建造者模式,包括其基本概念、UML类图、通用代码示例以及一个汽车生产案例。建造者模式将产品构建与表示分离,允许创建不同表示的复杂对象。案例中展示了如何使用建造者模式构建不同配置的奔驰和奥迪汽车模型,强调了模式在处理产品组装顺序和定制化需求中的灵活性。
摘要由CSDN通过智能技术生成

23种设计模式6_建造者模式

1 基本介绍

建造者模式也叫生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式的UML类图:

在这里插入图片描述

如上图,建造者模式种有4种角色:

Product产品类 通常是实现了模板方法模式,也就是有模板方法和基本方法。

Builder抽象建造者 规范产品的组件,一般是由子类实现。

ConcreteBuilder具体建造者 实现抽象类定义的所有方法,并且返回一个组建好的对象。

Director导演类 负责安排已有模块的顺序,然后告诉Builder开始建造

2 建造者模式的通用代码

// 产品类
public class Product {
    public void method() { /*业务逻辑处理*/ }
}
// 抽象建造者
public abstract class Builder {
    // 这个方法用来设置生产不同的产品
    public abstract void setDiff();
    // 建造产品
    public abstract Product buildProduct();
}
// 具体建造者
public class ConcreteBuilder extends Builder {
    private Product product = new Product();
    @Override
    public void setDiff() { /*特定产品的处理逻辑*/ }

    @Override
    public Product buildProduct() {
        return product;
    }
}
// 导演类
public class Director {
    private Builder builder = new ConcreteBuilder();
    // 构造不同的产品
    public Product getProduct() {
        // 通过不同的处理逻辑产生不同的产品
        builder.setDiff();
        return builder.buildProduct();
    }
}

3 案例演示

3.1 需求

生产汽车,有奔驰和奥迪两个品牌,两个品牌各有两种模型A和B,通用功能:启动、发出喇叭声、发出引擎声、熄火、行驶。客户需要自己定义各个品牌车模型所具有的功能。

3.2 代码演示

// 车辆模型的通用抽象类
public abstract class CarModel {
    // 记录客户自定义的通用功能顺序
    private ArrayList<String> sequence = new ArrayList<>();

    // 启动
    protected abstract void start();
    // 喇叭声
    protected abstract void alarm();
    // 引擎声
    protected abstract void engineBoom();
    // 熄火
    protected abstract void stop();

    public final void run() {
        for (String fucName : sequence) {
            if ("启动".equals(fucName)) { this.start(); }
            if ("喇叭声".equals(fucName)) { this.alarm(); }
            if ("引擎声".equals(fucName)) { this.engineBoom(); }
            if ("熄火".equals(fucName)) { this.stop(); }
        }
    }

    public void setSequence(ArrayList<String> sequence) {
        this.sequence = sequence;
    }
}
// 奔驰模型
public class BenzModel extends CarModel {
    @Override
    protected void start() { System.out.println("奔驰车。。。。启动"); }
    @Override
    protected void alarm() { System.out.println("奔驰车。。。。喇叭声"); }
    @Override
    protected void engineBoom() { System.out.println("奔驰车。。。。引擎声"); }
    @Override
    protected void stop() { System.out.println("奔驰车。。。。熄火"); }
}
// 奥迪模型
public class AudiModel extends CarModel {
    @Override
    protected void start() { System.out.println("奥迪车。。。。..启动"); }
    @Override
    protected void alarm() { System.out.println("奥迪车。。。。..喇叭声"); }
    @Override
    protected void engineBoom() { System.out.println("奥迪车。。。。..引擎声"); }
    @Override
    protected void stop() { System.out.println("奥迪车。。。。..熄火"); }
}
// 抽象的建造者
public abstract class CarBuilder {
    // 设置功能顺序
    public abstract void setSequence(ArrayList<String> sequence);
    // 设置完顺序后就可以获得车辆模型
    public abstract CarModel getModel();
}
// 奔驰建造者
public class BenzBuilder extends CarBuilder{
    private BenzModel benz = new BenzModel();
    @Override
    public void setSequence(ArrayList<String> sequence) {
        this.benz.setSequence(sequence);
    }

    @Override
    public CarModel getModel() {
        return this.benz;
    }
}
// 奥迪建造者
public class AudiBuilder extends CarBuilder{
    private AudiModel audi = new AudiModel();
    @Override
    public void setSequence(ArrayList<String> sequence) {
        this.audi.setSequence(sequence);
    }

    @Override
    public CarModel getModel() {
        return this.audi;
    }
}
// 导演类
public class Director {
    private ArrayList<String> sequence = new ArrayList<>();
    private BenzBuilder benzBuilder = new BenzBuilder();
    private AudiBuilder audiBuilder = new AudiBuilder();

    private String start = "启动";
    private String alarm = "喇叭声";
    private String engineBoom = "引擎声";
    private String stop = "熄火";

    /* 客户车辆功能需求交给导演类进行管理整合
    * 奔驰A:启动、喇叭声、引擎声、熄火
    * 奔驰B:启动、引擎声、熄火
    * 奥迪A:启动、熄火
    * 奥迪B:喇叭声、启动、熄火
    */
    // 奔驰A
    public BenzModel getBenzAModel() {
        // 全局属性需要清空,要么就定义到方法内部
        this.sequence.clear();
        sequence.add(start);
        sequence.add(alarm);
        sequence.add(engineBoom);
        sequence.add(stop);
        this.benzBuilder.setSequence(sequence);
        return (BenzModel) this.benzBuilder.getModel();
    }
    // 奔驰B
    public BenzModel getBenzBModel() {
        this.sequence.clear();
        sequence.add(start);
        sequence.add(engineBoom);
        sequence.add(stop);
        this.benzBuilder.setSequence(sequence);
        return (BenzModel) this.benzBuilder.getModel();
    }
    // 奥迪A
    public AudiModel getAudiAModel() {
        this.sequence.clear();
        sequence.add(start);
        sequence.add(stop);
        this.audiBuilder.setSequence(sequence);
        return (AudiModel) this.audiBuilder.getModel();
    }
    // 奥迪B
    public AudiModel getAudiBModel() {
        this.sequence.clear();
        sequence.add(alarm);
        sequence.add(start);
        sequence.add(stop);
        this.audiBuilder.setSequence(sequence);
        return (AudiModel) this.audiBuilder.getModel();
    }

}
public class Client {
    public static void main(String[] args) {
        Director director = new Director();
        // 1w辆奔驰A
        for (int i=0; i<30000; ++i) {
            director.getBenzAModel().run();
        }
        System.out.println("==========================");
        // 2w辆奔驰B
        for (int i=0; i<30000; ++i) {
            director.getBenzBModel().run();
        }
        System.out.println("==========================");
        // 3w辆奥迪A
        for (int i=0; i<30000; ++i) {
            director.getAudiAModel().run();
        }
        System.out.println("==========================");
        // 4w辆奥迪B
        for (int i=0; i<40000; ++i) {
            director.getAudiBModel().run();
        }
    }
}

4 建造者模式的应用

4.1 优点

①***封装性*** 使用建造者模式可以使客户端不必知道产品内部组成的细节

建造者独立,容易扩展 相互独立,易于扩展

便于控制细节风险 由于具体的建造者都是独立的,因此可以对建造过程逐步细化,而不会对其他的模块产生任何影响

4.2 应用场景

①相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。

②多个部件或者零件都可以装配到一个对象种,但是产生的运行结果又不相同时,则可以使用该模式。

③产品类非常复杂,或者产品类种的调用顺序不同产生了不同的效用,这个时候建造者模式就非常合适。

④在对象的创建过程种会使用到系统中的一些其他对象,这些对象在产品对象的创建过程种不易得到时,也可以采用建造者模式来封装该对象的创建过程。这种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟没有发觉,而要通过建造者模式来柔化创建过程,本身就已经违反的设计的初衷。

4.3 注意事项

的执行顺序,产生不同的事件结果时,可以采用建造者模式。

②多个部件或者零件都可以装配到一个对象种,但是产生的运行结果又不相同时,则可以使用该模式。

③产品类非常复杂,或者产品类种的调用顺序不同产生了不同的效用,这个时候建造者模式就非常合适。

④在对象的创建过程种会使用到系统中的一些其他对象,这些对象在产品对象的创建过程种不易得到时,也可以采用建造者模式来封装该对象的创建过程。这种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟没有发觉,而要通过建造者模式来柔化创建过程,本身就已经违反的设计的初衷。

4.3 注意事项

建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大的不同,虽然同为创建类模式,但是侧重点不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧课程内容和目标本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑吧,高同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值