建造者模式(Builder)

TensorRT工作手册 前段时间写了tvm的转换编译部署相关的文章, 牛先生:神经网络编译器TVM,autoTVM自动代码优化及c++部署cuda实践20 赞同 · 0 评论文章正在上传…重新上传取消​ 以及tensorrt偏向讲原理的文章: 牛先生:tensorRT量化实践手册3 赞同 · 0 评论文章 后来发现现在用tensorrt的还更多一些。今天也总结下,tensorrt的对应python接口模型转换,模型推理,模型量化相关的内容。 作者做tensorrt在ubuntu桌面和jetson都做了相关的实践。总的.. 阅读详情
    建造模式是一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示,将其复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。
    建造者模式通常包括下面几个角色:
  • Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
  • ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
  • Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
  • Product:要创建的复杂对象。
    使用场景: 
  • 需要生成的对象具有复杂的内部结构。 
  • 需要生成的对象内部属性本身相互依赖。
    与工厂模式的区别是:工厂方法模式的对象粒度比较粗,建造者模式的产品对象粒度比较细。建造者模式更加关注与零件装配的顺序。
如下举例说明:汽车厂生产一辆汽车(ConcreteBuilder),内部可分为生产发动机(ProductEngine)、底盘(ProductChassis)和外壳(ProductShell)三个步骤。
  • 汽车生产厂厂长(Diretor)根据市场需要生产不同种类汽车,可供客户选择不同的。
  • 厂长调研后,将生产企业划分为生产发动机(ProductEngine)、底盘(ProductChassis)和外壳(ProductShell)三个步骤。
  • 生产线总管(ConcreteBuilder)去构建;
  • 将组装起来的车进行售卖。
样例如下:


public interface Builder {
//生产发动机
public abstract void buildEngine(String type);
//生产底盘
public abstract void buildChassis(String type);
//生产外壳
public abstract void buildShell(String type);
public abstract Car getCar();
}

public class Director {
//持有当前需要使用的建造器对象
private Builder builder;
//发动机类型
private String engineType;
//底盘类型
private String chassisType;
//外壳类型
private String shellType;
Director(Builder builder) {
this.builder = builder;
}
public String getEngineType() {
return engineType;
}
public void setEngineType(String engineType) {
this.engineType = engineType;
}
public String getChassisType() {
return chassisType;
}
public void setChassisType(String chassisType) {
this.chassisType = chassisType;
}
public String getShellType() {
return shellType;
}
public void setShellType(String shellType) {
this.shellType = shellType;
}
//产品构造方法,负责调用各个建造方法
public void construct(){
//首先生产发动机
//声明为抽象方法,具体由子类实现
builder.buildEngine(engineType);
//其次生产底盘
//声明为抽象方法,具体由子类实现
builder.buildChassis(chassisType);
//最后生产外壳
//声明为抽象方法,具体由子类实现
builder.buildShell(shellType);
}
}

//建造者类
public class ConcreteBuilder implements Builder {
private Car car = new Car();
@Override
public void buildEngine(String type) {
if("engineHigh".equals(type)) {
Part engine = new EngineHigh();
car.addPrt(engine);
System.out.println("生产发动机");
}
else if("engineLow".equals(type)) {
Part engine = new EngineLow();
car.addPrt(engine);
}
}
@Override
public void buildChassis(String type) {
if("chassisHigh".equals(type)) {
Part chassis = new ChassisHigh();
car.addPrt(chassis);
}
else if("chassisLow".equals(type)) {
Part chassis = new ChassisLow();
car.addPrt(chassis);
}
}
@Override
public void buildShell(String type) {
if("shellRed".equals(type)) {
Part shell = new ShellRed();
car.addPrt(shell);
}
else if("shellBlack".equals(type)) {
Part shell = new ShellBlack();
car.addPrt(shell);
}
}
@Override
public Car getCar() {
return car;
}
}

public class Car {
//汽车模块集合
private List<Part> parts = new ArrayList<Part>();
//组装零件
public void addPrt(Part part){
parts.add(part);
}
//展示生产的零件
public void showParts() {
for(Part part: parts)
{
System.out.println("已经生产了:" + part.name() + ",价格为: " + part.price());
}
}
//获取当前Car的价格
public float getCost() {
float cost = 0;
for(Part part: parts)
{
cost += part.price();
}
return cost;
}
}

public interface Part {
//价格
public float price();
//名称
public String name();
}

public abstract class Engine implements Part {
@Override
public float price() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String name() {
// TODO Auto-generated method stub
return null;
}
}

public class EngineHigh extends Engine {
public float price() {
return (float) 10.12;
}
public String name() {
return "高配发动机";
}
}

public class EngineLow extends Engine {
public float price() {
return (float) 10.12;
}
public String name() {
return "高配发动机";
}
}

public abstract class Chassis implements Part {
@Override
public float price() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String name() {
// TODO Auto-generated method stub
return null;
}
}

public class ChassisHigh extends Chassis {
public float price() {
return (float) 5.3;
}

public String name() {
return "高配底盘";
}
}

public class ChassisLow extends Chassis {
public float price() {
return (float) 3.1;
}
public String name() {
return "低配底盘";
}
}

public abstract class Shell implements Part {
@Override
public float price() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String name() {
// TODO Auto-generated method stub
return null;
}
}

public class ShellBlack extends Shell{
public float price() {
return (float) 1.9;
}
public String name() {
return "黑色外壳";
}
}

public class ShellRed extends Shell{
public float price() {
return (float) 1.9;
}
public String name() {
return "红色外壳";
}
}

public class BuilderDemo {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.setEngineType("engineHigh");
director.setChassisType("chassisHigh");
director.setShellType("shellRed");
director.construct();
Car car = builder.getCar();
car.showParts();
float price = car.getCost();
System.out.println(price);
}
}

生产发动机
已经生产了:高配发动机,价格为: 10.12
已经生产了:高配底盘,价格为: 5.3
已经生产了:红色外壳,价格为: 1.9
17.32



设计模式-Builder模式demo demo中使用了设计模式中的建造者模式,代码非常精简,本地可正常运行,亲测有效! 立即下载

相关推荐

DVWA靶场实战:手把手教你绕过文件上传限制,用蚁剑连接一句话木马

本文详细介绍了在DVWA靶场中如何绕过文件上传限制并利用蚁剑连接一句话木马的实战技巧。通过分析文件上传漏洞原理、创建一句话木马、使用Burp Suite拦截修改请求以及配置蚁剑连接WebShell的全过程,帮助安全研究人员深入理解Web安全防护与攻击技术。

weixin_30335575的博客 90

‘tensorrt.tensorrt.Builder‘ object has no attribute ‘build_cuda_engine‘

问题简述: AttributeError: 'tensorrt.tensorrt.Builder' object has no attribute 'build_cuda_engine' 原因: tensorrt版本大于等于7时,不再使用build_cuda_engine。 解决办法: print('[info] Building an engine...') if TRT_VERSION_MAJOR >= 7: # Create an optimization profile (se

qq_38333041的博客 9107

从d、q轴电流到电机性能:FOC控制中角度偏移的实战影响与调试策略

本文深入探讨了永磁同步电机FOC控制中d、q轴电流与角度偏移对电机性能的影响及调试策略。通过分析角度偏移导致的效率下降、电流异常等问题,提供了实用的四步调试法和参数优化技巧,帮助工程师有效提升电机控制精度和效率。

weixin_29264201的博客 293

TensorRT快速上手指南

最近一段时间接触了TensorRT,因此顺带整理了一份TensorRT中一些常用关键组件的笔记,以方便未来能够快速查阅和上手。需要注意的是本文只是一些常用特性与关键组件的梳理,而不是一个小白入门的教程,所以后续文章内容并不会提供快速上手的样例代码,实际上TensorRT官方的example中已经挺完善了,从0到1入门的新手建议直接看官方example中的代码。

AI人工智能的海洋 2033

【ESP32 S3 开发】基于I2S协议驱动INMP441数字麦克风 实现语音采集

注意INMP441的 L/R接地之后才稳定输出数据 否则一直都是0WAV格式说明这里主要是想说wav文件重要的就是生成一个wavhead来标识它是一个wave文件,wave文件的data chunk 中的data部分还是PCM编码格式的数据,直接从I2S读进去就可以,不需要压缩。wav文件的头一般由4个chunk组成。 以16bit深度为例,代码如下。其他深度可以根据注释自行计算。 I2S -> DAC i2s_read()函数,向flash中划分的一个buff当中读入byte数组。以16bit深度为例,一

m0_43395703的博客 1万+

【后端】主流后端语言:JAVA、C、C++、GO、PYTHON

软件开发领域,语言本身在各自领域都有适用场景,有许多流行的编程语言可供选择,每种语言都有其独特的特点和适用场景。

wnm23的专栏 1万+

利用python版tensorRT导出engine【以yolov5为例】

在介绍导出engine过程需要先介绍一下会遇到的相关术语。 1.建立logger:日志记录器 2.建立Builder:网络元数据 用于搭建网络的入口,网络的TRT内部表示以及可执行程序引擎都是由该对象的成员方法生成

z240626191s的博客 1万+

Google Earth Engine(GEE)——MOD09A1/MOD11A2/MOD13A1不同的QA波段去云进行分析

​​​​​​​大多数光学卫星图像产品都带有一个或多个 QA 波段,允许用户评估每个像素的质量并提取满足其要求的像素。QA 波段最常见的应用是提取有关多云像素的信息并对其进行屏蔽。但是 QA 波段包含大量其他信息,可以帮助您从分析中删除低质量数据。通常,QA 频带中包含的信息存储为按位标志。在这篇文章中,我将介绍与位运算相关的基本概念,以及如何使用位掩码提取和屏蔽特定的质量指标。

此星光明博客 4574

模型部署入门教程(七):TensorRT 模型构建与推理

模型部署入门教程继续更新啦!相信经过前几期的学习,大家已经对 ONNX 这一中间表示有了一个比较全面的认识,但是在具体的生产环境中,ONNX 模型常常需要被转换成能被具体推理后端使用的模型格式。本篇教程我们就和大家一起来认识大名鼎鼎的推理后端 TensorRT。...

qq_39967751的博客 6692

机器视觉工程师如何进行高速运动物体捕获

硬件方面使用高帧率相机(如工业相机、高速摄像机)确保充足的光照条件使用高性能计算平台减少处理延迟软件方面背景减除技术快速分离运动物体卡尔曼滤波预测物体轨迹ROI技术减少计算量多线程处理提高实时性实际应用中的关键考量针对特定场景调整参数(如阈值、滤波器参数等)平衡计算资源与实时性要求结合特定领域知识优化算法(如物体运动特性)上述示例代码实现了一个基础的高速物体跟踪系统,通过背景减除和卡尔曼滤波实现对高速物体的检测和跟踪。

zhangzhechun_02的博客 624

大疆前端开发面试题及参考答案(4万字长文)

在前端项目中,难点和性能优化的挑战无处不在。比如在处理复杂交互界面时,实现流畅的动画效果和实时反馈就是一大难点。当界面中有大量元素需要同时进行交互和动态更新,像电商平台的商品筛选和排序功能,不仅要保证操作的即时响应,还要确保界面在各种设备和网络环境下的稳定性,这就需要对事件处理、DOM 操作和数据更新机制有深入理解。在性能优化方面,首屏加载速度是常见的难点。当页面包含大量图片、脚本和样式文件时,如何合理地进行资源压缩、合并与缓存,以减少加载时间,是需要精心考虑的。

大模型大数据攻城狮的专栏 1152

建造者模式-Builder Pattern

建造者模式(Builder Pattern)是一种创建型设计模式,它可以让你构建复杂对象时更加灵活和可控。这种模式的主要目的是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。在软件开发中,我们经常会遇到一些复杂的对象,这些对象通常由多个部分组成,而且每个部分的创建和组合可能需要花费大量的时间和精力。为了解决这个问题,我们可以使用建造者模式来简化对象的构建过程。建造者模式的核心思想是将复杂对象的构建过程分解为多个简单的步骤,每个步骤负责创建一个特定的部分。

jaune162的专栏,最新动态请关注:https://jaune162.blog 1383

基于matlab目标雷达横截面建模(附源码)

雷达系统依靠目标反射或散射来检测和识别目标。目标反射越强,雷达接收器返回的回波就越大,从而获得更高的信噪比(SNR)和更高的检测可能性。在雷达系统中,从目标反射的能量由雷达横截面(RCS)决定,定义为sigma代表RCS,R是雷达与目标之间的距离,Es是从目标反射的信号的场强,以及Ei是入射到目标上的信号的场强。通常,目标向各个方向散射能量,RCS是入射角,散射角和信号频率的函数。RCS 取决于目标的形状和构建目标的材料。用于RCS的常用单位包括平方米或dBsm。

珞瑜的博客 3083

设计模式-03建造者模式Builder Pattern

建造者模式摘要:建造者模式是一种创建型设计模式,用于分步骤构建复杂对象,使构建过程与对象表示分离。该模式适用于需要创建包含多个组成部分的对象,特别是当这些部分可选或构建顺序可变时。通过UML类图展示了经典建造者模式和链式建造者模式的结构差异,并提供了Java实现示例。实现方式包括通过Builder内部类分步骤设置对象属性,最后通过build()方法返回完整对象,使代码更清晰且避免构造器参数过多的问题。

d3y1`5 81_09 1205

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java 设计模式——建造者模式(Builder Pattern)

Java 设计模式——建造者模式(Builder Pattern) 一.简介 1.定义 将一个复杂对象的构建与它表示分离,使用同样的构建过程可以创建不同的表示 2.主要作用 在用户不知道对象建造过程和细节的情况下就可以直接创建复杂对象 3.如何使用 用户只需给出指定复杂对象的类型和内容,建造者模式负责按顺序创造对象(把内部建造过程和细节隐藏起来) 4.解决的问题 (1).方便用户创建复杂的对...

a158s168的博客 276

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Builder Pattern 建造者模式

建造者模式是日常开发中比较常见的设计模式,它的主要作用就是将复杂事物创建的过程抽象出来,该抽象的不同实现方式不同,创建出的对象也不同。通俗的讲,创建一个对象一般都会有一个固定的步骤,这个固定的步骤我们把它抽象出来,每个抽象步骤都会有不同的实现方式,不同的实现方式创建出的对象也将不同。举个常见的例子,想必大家都买过车,车的生产或者组装其实就是属于建造者模式,我们知道,车的生产都需要安装发动机,变速箱,底盘等组件。我们可以把这个安装步骤抽象出来,至于到底装哪种发动机,比如宝马还是奔驰就是对该抽象安装步骤的具体实

weixin_40955388的博客 289

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

5、建造者模式(Builder Pattern)

建造者模式(Builder Pattern)

qq_38304915的博客 1188

一文看懂设计模式-建造者模式(builder Pattern)

1、意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示2、主要解决:主要解决在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;

2301_79351943的博客 839

建造者模式(Builder Pattern)详解

建造者模式是一种创建型设计模式,它允许你分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象。建造者模式的核心思想是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种强大的创建型设计模式,特别适合于构建复杂对象。它将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。在Java中,建造者模式特别有用,可以避免"重叠构造函数"问题,提高代码的可读性和维护性。

yk_dflkg的博客 1861

建造者模式(Builder Pattern)

建造者模式(Builder Pattern) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 结构 参与者 Builder ——为创建一个Product对象的各个部件指定抽象接口。 ConcreteBuilder ——实现Builder的接口以构造和装配该产品的各个部件。 ——定义并明

jiangxt211的专栏 389

设计模式-建造者模式(Builder Pattern)

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式要求建造过程中是稳定的。 Android 用到的 Builder 模式:http://blog.youkuaiyun.com/bboyfeiyu/article/details/15504187 转载于:https://www.cnblogs.com/liyira...

diaolapei9880的博客 145

Java设计模式--建造者模式【Builder Pattern】

昨晚回到家里,我爸爸气冲冲地跟我诉苦,“哎!,干个装修容易么?顾客啥都不懂,还非得规定装修顺序,要先贴地板砖后刷墙,到时候贴好的地砖上全是泥,哪有这么干活的?”老爸干了一辈子的装修,一切事宜由他全权负责,难免心力憔悴。但是,我仔细想了下这个事情,如果老爸签订了一个公司,公司负责接活揽活,规定装修要求,老爸只负责执行,那不就轻松了吗?于是我就想起了建造者模式。       建造者模式的定义是:将一

CoderLover 481

设计模式:建造者模式(Builder Pattern)

建造者模式是一种创建型设计模式,它允许你分步骤创建复杂对象,使相同的构建过程可以创建不同的表示。;本质是 把"怎么装配"和"装成什么样"分离,让同样的装配流程可以生产不同"口味"的对象。

倔强老吕的博客 1687

建造者模式 Builder Pattern

一、模式介绍 建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。 1.1、定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成的。它将变与不变分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。 1.2、优点 封装性好,构建和表示分离 扩展性好,各个具体的建造者相互独立,有利于系统的解耦 客户端不必知道产品内部组成的细节

木易 315

建造者模式(Builder Pattern)

建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式通常包括下面几个角色: Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。 ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过...

diaoyang7352的博客 80

Java设计模式|建造者模式Builder Pattern

Java设计模式|建造者模式Builder Pattern 前言: 在日常生活中,我们可能会遇到这一类型的需求,例如一个实体类里有很多个属性,但是我们只想要其中的几种组合成一个新的对象,这个时候就可以使用建造者模式了,它提供了一种创建对象的最佳方式。建造者模式虽然比较好用,但是大家平时写代码的时候要谨记,不要滥用设计模式,不然的话可能会适得其反啊! 建造者模式 介绍:建造者模式又被称呼为生成器模式,这种类型的设计模式属于创建型模式,使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它

QAQFyl的博客 547
上一篇: 单例模式(Singleton)
下一篇: 桥接模式(Bridge)
水之光love
博客等级 码龄12年 56粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值