建造者模式(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中使用了设计模式中的建造者模式,代码非常精简,本地可正常运行,亲测有效! 立即下载

相关推荐

声品质粗糙度matlab,声品质的应用分析方法

声品质的应用分析方法2016-04-05 09:18:57阅读次数:14198摘要:声品质分析在噪声的主观评价方面已经得到越来越多的应用。本文比较了声品质分析与传统计权声级的区别,并介绍了在声品质分析的实际应用中,针对稳态信号、非稳态信号的几种不同分析方法,以及各分析方法的要求和特点。关键词:声品质,响度,尖锐度,粗糙度,波动度1前言传统评价噪声的方法主要为计权声压级,用以反映声音的大小。但是人耳...

weixin_30767323的博客 2438

‘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

结构方程模型amos的操作与应用pdf_AMOS结构方程进行医学问卷量表分析教程(一阶简单路径效应分析)...

在生物医药的数据统计分析中,要研究量表和量表之间的关系时候,由于维度题项较多,而不再是单一的变量,因此我们要使用AMOS结构方程进行处理。​ 举个例子,比如对住院患者的相关研究,设置了患者在住院期间的适应性量表和自我效能的量表,想考察患者适应性与自我效能之间的影响关系,或者说适应性的强弱是否会影响到患者自我效能的高低。此时适应性量表和自我效能量表都不是单一的变量,而是有N个题项构成的...

weixin_39637614的博客 7708

TensorRT快速上手指南

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

AI人工智能的海洋 2033

《玩儿起来吧》MATLAB 实时图像处理系列(一二三四)

大家学了图像处理之后,是不是就想学以致用。而要用于生活中,最好的方式就是和摄像头搭配,实现实时图像处理。今天就给大家分享MATLAB实时图像处理的基础方法,希望能帮你快速入门。

HPC_ZY 1万+

PySpark机器学习生产化陷阱:跨节点依赖问题的7种解决方案

隐式依赖陷阱使用ldd解决方案:在基础镜像中预装和路径冲突终极解法依赖树瘦身技巧用conda-tree可减少40%环境体积PySpark机器学习生产化的核心矛盾在于分布式环境的确定性与灵活性不可兼得。轻量级方案(1-3)牺牲一致性换取灵活性重量级方案(4-6)牺牲灵活性换取确定性混合方案(7)针对特殊场景补充正如某AI平台架构师所言:“环境一致性不是技术问题,而是工程纪律问题选择适合团队当前阶段的方案,建立严格的依赖管理流程,才能让PySpark真正扛起生产环境的大旗。

datacanvas2426的博客 909

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

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

z240626191s的博客 1万+

CATIA CAA 二次开发去除面内开孔

测试模型: 代码说明:以下代码在拓扑级去除Face的内部loop,更改后的Body通过oispBody参数输出。主要使用CATSmartBodyDuplicator拓扑操作实现 HRESULT CAAStarterCmd::RemoveHoleOnFace(CATBody_var &ispBody,CATBody_var &oispBody){ CATLISTP(CATCell)olistFace; ispBody->GetAllCells(olistFace,2); CATF

weixin_45445751的博客 2264

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

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

qq_39967751的博客 6692

IEC103协议实战指南:报文解析与传输优化策略

本文深入解析IEC103协议在电力自动化系统中的核心应用,重点拆解其固定帧与可变帧两种报文格式,并详细阐述了主从问答与非平衡传输机制。文章结合实战经验,针对报文解析中的常见问题(如字节序、超时重发)提供了解决方案,并探讨了传输层优化策略,旨在帮助工程师实现更可靠、高效的通信链路。

r2s3t4的博客 541

用AG9311芯片DIY一个多功能Type-C扩展坞:从原理图到PCB布局的保姆级指南

本文详细介绍了如何利用AG9311芯片DIY多功能Type-C扩展坞,涵盖从原理图设计到PCB布局的全过程。AG9311芯片作为高性价比的Type-C控制器,支持HDMI 2.0、USB 3.0、PD快充和千兆网口,适合硬件爱好者打造个性化扩展坞。文章还提供了调试技巧和进阶优化建议,帮助读者轻松完成项目。

weixin_42520909的博客 403

建造者模式-Builder Pattern

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

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

OpenClaw入门必装Skills(附使用场景)

很多同学安装了OpenClaw后,但却不会使用,就相当于你只是拥有了一副强大的躯干,却没有给它装上能够灵活执行任务的“手脚”和负责思考决策的“大脑插件”——Skills。没有这些核心能力的支撑,OpenClaw只是一个“空壳”,无法真正应用到实际业务场景中,更谈不上提升效率或解决复杂问题。所以,安装只是第一步,要真正让OpenClaw“活”起来,为我们所用,就需要给OpenClaw安装各种Skills,这个过程就是养虾的过程。

十二测试录 3222

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

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

d3y1`5 81_09 1205

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

a158s168的博客 276

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Builder Pattern 建造者模式

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

weixin_40955388的博客 289

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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、付费专栏及课程。

余额充值