uniapp 购物弹窗组件 (微信小程序)

 效果图,暂时只适应单规格,居中弹出和下方弹出,如需求不满足,请自行修改代码

(更新于24/11/15)

居中显示效果

下方弹出效果

html 

<template><view class="" v-if="show":class="mode=='center'?(style_show?'specifications_show_center openAnimation':'specifications_show_center closeAnimation'):mode=='bottom'?(style_show?'specifications_show_bottom  openAnimation':'specifications_show_bottom  closeAnimation'):''"@tap.stop="()=>{}"><view class="specifications":class="mode=='bottom'?(style_show?'specifications_bottom_open  ':'specifications_bottom_close  '):''"@tap.stop="()=>{}"><view class="specification"><view class="specification_title">请选择规格</view><image class="colseIcon":src="$publicfun.locaAndHttp()?'../../static/all/del.png':$publicfun.httpUrlImg('colse.png')"mode="aspectFit" @tap.stop="colosePopue"></image><!-- 商品信息 --><view class="modal-header flex "><view class="header-left ss-m-r-30"><image class="sku-image" :src="component_goodsDetail.image" mode="aspectFill"@tap.stop="previewImages1(component_goodsDetail.image,1)"></image></view><view class="header-right   "><view class="goods-title ss-line-2">{{component_goodsDetail.title||'商品名称' }}</view><view class="header-right-bottom ss-flex ss-col-center ss-row-between"><view class="price-text">{{is_kongobj=='{}'? Number(component_goodsDetail.price*1).toFixed(2) :Number(chooseSpecificationObject.price*1).toFixed(2)}}</view><view class="stock-text ss-m-l-20" v-if="is_kongobj!='{}'">库存{{ is_kongobj=='{}'?component_goodsDetail.goods_stock:chooseSpecificationObject.inventory}}件</view></view></view></view><view class="specification_title2">规格</view><view class="specification_title_1"><scroll-view scroll-y="true" style="height: 100%;"><view><height :hg='30'></height><view class="flex flexwrap"><view v-for="(itemall,indexall) in component_goodsDetail.multiplejson" :key="indexall"@click.stop="setguigeindex(indexall,itemall)"><view:class="guigeindex==indexall?'specification_title_1_title specification_title_1_titlec':'specification_title_1_title'"v-if='itemall.title'>{{itemall.title}}</view></view></view><!-- 单规格 --><view class="mt30" v-if="false"><view class="specification_title_1_content"><view class="specification_title_1_content_flex flex jc ac":class="guigeindex2==index?'specification_title_1_content_flex_activate':''"v-for="(item,index) in specification_list[guigeindex].item" :key="index"@tap.stop="selective_specification(item.guigechildren,item)"><!-- 可用于显示商品图片 --><!-- <image class="image" :src="sheep.$url.cdn(type_return_img(item.id).url)"mode="aspectFill" v-if="type_return_img(item.id).url!=''"></image> --><view>{{item.name}}</view></view><view class="nogoods" v-if="item.guigechildren.length==0" style="margin: auto;"><u-empty text='没有规格~' icon=""></u-empty></view></view></view></view></scroll-view></view><view class="" v-if="mode=='center'"><view class="selected"><text>已选规格:</text>{{is_kongobj=='{}'?'未选择':chooseSpecificationObject.title}}</view></view><view class="buy-num-box flex jsb ac"><view class="label-text">购买数量</view><view class="ShopCar flex jc ac"><image class="ShopCaricon":src="$publicfun.locaAndHttp()?'../../static/all/del.png':$publicfun.httpUrlImg('del.png')"mode="aspectFit" @tap.stop="delnum(item)"></image><input type="number" v-model="goodsNum" class="ShopCarInp" @blur="inpnum(item)" /><image class="ShopCaricon":src="$publicfun.locaAndHttp()?'../../static/all/add.png':$publicfun.httpUrlImg('add.png')"mode="aspectFit" @tap.stop="addnum(item)"></image></view></view><view class="sublist" v-if="mode=='center'"><view class="sublist_left"><view class=""><text>总计 </text><text class="TotalPrices"><text>¥</text>{{is_kongobj=='{}'?'0.00':Number(chooseSpecificationObject.price*goodsNum).toFixed(2) }}</text></view></view><view class="sublist_right" @tap.stop="goodsAddCar()"><text>+</text> <text>加入购物车</text></view></view><view class="specification_bottombuts" v-if="mode=='bottom'"><view class="specification_bottombuts_but specification_bottombuts_ShoppingCart"@tap.stop="goodsAddCar()">加入购物车</view><view class="specification_bottombuts_but specification_bottombuts_PayNow" @tap.stop="newPay()">立即购买</view></view><view class="" style="width: 100%;height: 30px;" v-if="mode=='bottom'"></view></view></view></view>
</template>

js

export default {name: "specification",//style_show  主要控制动画效果//mode   设置方向弹出//show   控制显示不显示//goodsDetail  传入的商品信息props: ['show', 'style_show', 'goodsDetail', 'mode'],data() {return {orderprive: '',style: [], //规格动态样式// goodsDetail: { //模拟商品信息// 	goods_name: '番茄鸡蛋面',// 	goods_price: '9.90',// 	goods_stock: 999,// 	specification: [{// 		goods_name: '规格1',// 		goods_price: '9.90',// 		goods_stock: 999,// 		children: [{// 			goods_name: '11',// 			goods_price: '6.60',// 			goods_stock: 999,// 		}]// 	}]// },chooseSpecificationObject: {}, //选中的规格guigeindex: 0, //一级规格guigeindex2: 0, //二级规格component_goodsDetail: {}, //请求接口的商品数据goodsNum: 1,};},onLoad() {},watch: {
//监听是否有商品id传入进来goodsDetail: {handler(newName, oldName) {//获取商品信息的接口GoodsDetail({id: newName.id}).then(res => {this.component_goodsDetail = res.data;this.chooseSpecificationObject = res.data ? res.data.multiplejson[0] : {};this.guigeindex = 0;console.log(res, '商品详情');})this.goodsNum = 1;},immediate: true,deep: true}},onShow() {},computed: {//判断是否选中规格is_kongobj() {console.log(this.chooseSpecificationObject);return JSON.stringify(this.chooseSpecificationObject); }},methods: {newPay() {if (!this.style_show) {return}let that = this;//可用于显示弹窗不默认选中规格的判断// if (JSON.stringify(this.choose_specification) == '{}') {// 	uni.showToast({// 		title: "请选择规格",// 		icon: "none"// 	})// 	return// }// console.log(that.goodsNum);// return// 直接购买将需要的信息提交到vuex缓存中,用于渲染页面this.$store.commit('set_is_immediately', {type: 'goodsDetail',id: that.component_goodsDetail.id, //iditem: that.chooseSpecificationObject, //规格名称count: that.goodsNum,goodsDetail: [that.component_goodsDetail] //商品列表数组})//跳转到提交订单页面this.$publicfun.navigateTo('/pagesA/SubmitOrder/SubmitOrder')this.colosePopue()},//选中规格setguigeindex(index, item) {if (!this.style_show) {return}this.chooseSpecificationObject = item;this.guigeindex = index;if (this.goodsNum > this.chooseSpecificationObject.inventory) {this.goodsNum = this.chooseSpecificationObject.inventory;}},//删除购物车数量delnum() {if (!this.style_show) {return}if (this.goodsNum > 1) {this.goodsNum--;} else {//数量少于1 关闭弹窗this.colosePopue()}},//添加购物车数量addnum() {if (!this.style_show) {return}if (this.goodsNum < this.chooseSpecificationObject.inventory) {this.goodsNum++;} else {uni.showToast({title: '超出购买数量~',icon: "none"})}},//手动输入购买数量inpnum() {if (!this.style_show) {return}if (this.goodsNum > this.chooseSpecificationObject.inventory) {this.goodsNum = this.chooseSpecificationObject.inventory;}if (this.goodsNum == '') {// this.colosePopue()this.goodsNum = 1;this.$publicfun.showToast('购买数量不得少于1~')}if (this.goodsNum <= 0) {// this.colosePopue()this.goodsNum = 1;this.$publicfun.showToast('购买数量不得少于1~')}},//预览商品图片previewImages1(url, index) {
//因为动画效果是 用透明度为0,再消失,透明度改变的时候还可以点击,加这个判断是很必要的if (!this.style_show) {return}//预览图片this.$publicfun.previewImage({url: url,index: index})},//关闭弹窗colosePopue() {if (!this.style_show) {return}this.$emit('closeCar')// this.component_goodsDetail={};},//添加购物车goodsAddCar() {if (!this.style_show) {return}let that = this;//这是添加到购物车carAddAndDel({id: this.goodsDetail.id,count: this.goodsNum,item_name: this.chooseSpecificationObject.title,type: 'add'}).then(res => {if (res.code == 1) {//通过vuex更新数据this.$store.dispatch('fun_set_shopCar');// console.log(res);that.colosePopue();uni.showToast({title: '已添加到购物车~',icon: "none"})} else {uni.showToast({title: res.msg,icon: "none"})}})},}}

css部分

//居中显示.specifications_show_center {width: 100vw;height: 100vh;position: fixed;top: 0;left: 0;z-index: 999999999;background: rgba(0, 0, 0, 0.6);display: flex;justify-content: center;align-items: center;opacity: 1;border-radius: 18rpx;}.openAnimation {animation: slow_show 0.3s linear;}.closeAnimation {opacity: 0 !important;animation: close_slow_show 0.3s linear;}@keyframes slow_show {0% {opacity: 0;}100% {opacity: 1;}}@keyframes close_slow_show {0% {opacity: 1;}100% {opacity: 0;}}//从下方弹出显示.specifications_show_bottom {width: 100vw;height: 100vh;position: fixed;bottom: 0;left: 0;z-index: 999999999;background: rgba(0, 0, 0, 0.6);display: flex;justify-content: center;align-items: flex-end;opacity: 1;border-radius: 18rpx;.specifications {width: 100% !important;position: absolute;bottom: 0;left: 0;padding: 30rpx 50rpx !important;}.specifications_bottom_open {animation: From_bottom_to_top 0.22s linear;}.specifications_bottom_close {animation: From_top_to_bottom 0.3s linear;}}@keyframes From_bottom_to_top {0% {bottom: -100%;}100% {bottom: 0;}}@keyframes From_top_to_bottom {0% {bottom: 0;}100% {bottom: -100%;}}//以上是动画效果.specifications {width: 690rpx;padding: 30rpx;box-sizing: border-box;background: #fff;border-radius: 18rpx;.buy-num-box {height: 100rpx;// padding-left: 20rpx;// box-sizing: border-box;.ShopCar {.ShopCaricon {width: 46rpx;height: 46rpx;}.ShopCarInp {width: 100rpx;height: 46rpx;text-align: center;}}}.modal-header {// position: relative;padding: 20rpx 0;margin-top: 20rpx;.sku-image {width: 160rpx;height: 160rpx;border-radius: 10rpx;background: darkslategray;}.header-right {width: calc(100% - 160rpx - 20rpx);height: 160rpx;display: flex;flex-direction: column;justify-content: space-between;margin-left: 20rpx;}.close-icon {position: absolute;top: 10rpx;right: 20rpx;font-size: 46rpx;opacity: 0.2;}.goods-title {font-size: 28rpx;font-weight: bold;line-height: 42rpx;position: relative;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;.tig {border: 2rpx solid #ff6000;border-radius: 4rpx;width: 126rpx;height: 38rpx;position: absolute;left: 0;top: 0;.tig-icon {width: 40rpx;height: 40rpx;background: #ff6000;margin-left: -2rpx;border-radius: 4rpx 0 0 4rpx;.groupon-tag {width: 32rpx;height: 32rpx;}}.tig-title {font-size: 24rpx;font-weight: 500;line-height: normal;color: #ff6000;width: 86rpx;display: flex;justify-content: center;align-items: center;}}.info-title {text-indent: 132rpx;}}.header-right-bottom {display: flex;justify-content: space-between;align-items: center;}.price-text {font-size: 30rpx;font-weight: 500;color: red;font-family: OPPOSANS;&::before {content: '¥';font-size: 24rpx;}}.stock-text {font-size: 26rpx;color: #999999;}}.d_box {.d_box_item {font-size: 34rpx;color: #3d3d3d;width: 45%;margin-bottom: 20rpx;}}.specification {background: #FFFFFF;border-radius: 12rpx;position: relative;z-index: 10074;.specification_title {text-align: center;font-size: 38rpx;font-weight: 600;color: #353535;margin: 0 auto;}.colseIcon {width: 40rpx;height: 40rpx;position: absolute;right: 0rpx;top: 0rpx;}.specification_title2 {font-size: 38rpx;font-weight: 600;color: #353535;margin: 0 auto;margin-bottom: 30rpx;}.specification_goods_title {font-size: 38rpx;font-weight: 600;}.specification_title_1 {width: 100%;max-height: 400rpx !important;margin: 0 auto;.specification_title_1_title {font-size: 32rpx;font-weight: 600;color: #676767;// color: $AccentColor;display: inline-block;padding: 10rpx 20rpx;text-align: center;background: #fff;border-radius: 18rpx;white-space: nowrap;// border: 1rpx solid $AccentColor !important;border: 1rpx solid #676767 !important;margin-right: 10rpx;margin-bottom: 10rpx;}.specification_title_1_titlec {color: $AccentColor !important;// background: $AccentColor !important;border: 1rpx solid $AccentColor !important;}.specification_title_1_content {display: flex;flex-wrap: wrap;// overflow-x: auto;display: -webkit-box;-webkit-overflow-scrolling: touch;.specification_title_1_content_flex_activate {background: $AccentColor !important;border: 1rpx solid $AccentColor !important;color: #fff !important;}.font_sizi_1 {color: $AccentColor;}.font_sizi_2 {border-left: 1rpx solid $AccentColor;}.specification_title_1_content_flex {// height: 63rpx;background: #FFFFFF;border-radius: 14rpx;border: 1rpx solid #999;margin-right: 20rpx;text-align: center;// line-height: 63rpx;font-size: 28rpx;font-weight: 400;color: #343434;padding: 10rpx 20rpx;margin-bottom: 20rpx;.image {width: 60rpx;height: 60rpx;margin-right: 20rpx;border-radius: 12rpx;}}}}.close {position: absolute;bottom: -150rpx;left: 50%;transform: translateX(-50%);}}.selected {width: 100%;padding: 20rpx 0;background: #F5F5F5;margin-top: 60rpx;text {font-size: 24rpx;font-weight: 400;color: #363636;}text:nth-child(1) {font-size: 24rpx;font-weight: 400;color: #676767;padding: 0 20rpx;margin-left: 10rpx;}}.sublist {display: flex;align-items: center;justify-content: space-between;margin-top: 30rpx;// padding: 30rpx 40rpx;.sublist_left {.TotalPrices {margin-left: 10rpx;}text:nth-child(1) {font-size: 28rpx;font-weight: 600;color: #363636;}text:nth-child(2) {font-size: 28rpx;font-weight: 600;color: #FF0000;text:nth-child(1) {font-size: 28rpx;font-weight: 600;color: #FF0000;font-size: 24rpx;}}}.sublist_right {width: 234rpx;height: 62rpx;background: $AccentColor;border-radius: 12rpx;font-size: 32rpx;font-weight: 500;color: #F3FCFF;line-height: 62rpx;text-align: center;}}//从下方弹出的弹窗按钮.specification_bottombuts {width: 100%;margin: auto;display: flex;justify-content: space-between;align-items: center;margin-top: 20rpx;.specification_bottombuts_but {width: 50%;padding: 25rpx 20rpx;font-size: 28rpx;font-weight: bold;color: #fff;text-align: center;}.specification_bottombuts_ShoppingCart {background: #9dceff;border-radius: 99px 0 0 99px;}.specification_bottombuts_PayNow {background: #0a84ff;border-radius: 0px 99px 99px 0px;}}.minus {width: 25px;height: 25px;border-width: 1px;border-color: #E6E6E6;border-style: solid;border-top-left-radius: 100px;border-top-right-radius: 100px;border-bottom-left-radius: 100px;border-bottom-right-radius: 100px;@include flex;justify-content: center;align-items: center;}.input {padding: 0 10px;}.plus {width: 25px;height: 25px;border-width: 1px;background-color: #00B8FB;border-color: #00B8FB;border-style: solid;border-top-left-radius: 100px;border-top-right-radius: 100px;border-bottom-left-radius: 100px;border-bottom-right-radius: 100px;@include flex;justify-content: center;align-items: center;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机学习笔记 5. 数码管静态显示

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~ 目录 0、实现的功能 1、Keil工程 1-1 数码管显示原理 1-2 静态与动态显示 1-3 74HC573锁存器的工作原理 1-…

内容占位符:Kinetic Loader HTML+CSS 使用CSS制作三角形原理

内容占位符 前言 随着我们对HTML和CSS3的学习逐渐深入&#xff0c;相信大家都已经掌握了网页制作的基础知识&#xff0c;包括如何使用HTML标记构建网页结构&#xff0c;以及如何运用CSS样式美化页面。为了进一步巩固和熟练这些技能&#xff0c;今天我们一起来完成一个有趣且实…

【YOLOv8】安卓端部署-1-项目介绍

【YOLOv8】安卓端部署-1-项目介绍 1 什么是YOLOv81.1 YOLOv8 的主要特性1.2 YOLOv8分割模型1.2.1 YOLACT实例分割算法之计算掩码1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系1.2.1.2 插值时的目标检测中提取的物体特征1.2.1.3 coefficients&#xff08;系数&#xff09;作用1.…

Hadoop 学习心得

一、引言 &#xff08;一&#xff09;学习 Hadoop 的背景和目的 随着信息技术的飞速发展&#xff0c;数据量呈爆炸式增长&#xff0c;传统的数据处理方式已难以满足需求。在这样的背景下&#xff0c;为了能够在大数据领域有所发展&#xff0c;我开始学习 Hadoop。Hadoop 作为处…

【全面解读】Apache SeaTunnel常见问题全攻略

使用SeaTunnel需要安装Spark或者Flink这样的引擎么&#xff1f; 不需要&#xff0c;SeaTunnel 支持 Zeta、Spark 和 Flink 作为同步引擎的选择&#xff0c;您可以选择之一就行&#xff0c;社区尤其推荐使用 Zeta 这种专为同步场景打造的新一代超高性能同步引擎。Zeta 被社区用…

STM32完全学习——系统时钟设置

一、时钟框图的解读 首先我们知道STM32在上电初始化之后使用的是内部的HSI未经过分频直接通过SW供给给系统时钟&#xff0c;由于内部HSI存在较大的误差&#xff0c;因此我们在系统完成上电初始化&#xff0c;之后需要将STM32的时钟切换到外部HSE作为系统时钟&#xff0c;那么我…

分布式系统稳定性建设-性能优化篇

分布式系统稳定性建设-性能优化篇 系统稳定性建设是系统工程的核心内容之一。以下是一些重要的方面: 架构设计: 采用模块化、松耦合的架构设计,以提高系统的可扩展性和可维护性。合理划分系统功能模块,降低单个模块的复杂度。定义清晰的接口和数据交换标准,确保各模块之间协调…

网络学习第四篇

引言&#xff1a; 我们在第三篇的时候出现了错误&#xff0c;我们要就行排错&#xff0c;那么我们要知道一下怎么配置静态路由实现ping通&#xff0c;这样子我们才知道下一跳到底是什么&#xff0c;为什么这样子做。 实验目的 理解和掌握静态路由的基本概念和配置方法。 实…

[控制理论]—位置式PID与增量式PID

位置式PID与增量式PID 1.位置式PID 按模拟PID控制算法&#xff0c;以一系列的采样时刻点kT代表连续时间t&#xff0c;以矩形法数值积分近似代替积分&#xff0c;以一阶后向差分近似代替微分&#xff0c;即&#xff1a; t ≈ k T &#xff08; k 0 , 1 , 2... &#xff09; …

【c++丨STL】list的使用

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色&#xff0c;类似材质丢失 Addressable Play Mode Script加载模式 选择 Use Existiing Build 1.Unity 切换到 PC 平台&#xff0c;执行 Addressable Build 运行&#xff0c;加载 bundle 内的预制体 显示正常 2.Unit…

单片机学习笔记 6. 数码管动态显示

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示 目录 0、实现的功能 1、Keil工程 1-1 数码管动态显示 1-2 数组的定义与引用…

车企如何实现安全图纸外发管理

车企面临着日益增长的数据交换需求&#xff0c;尤其是设计图纸等敏感数据的外发管理。如何确保这些数据在传输过程中的安全性和效率&#xff0c;是车企急需解决的问题。我们将从几个关键性的因素上来分析一下怎么实现安全图纸外发管理。 统一管理与授权 采用专业的文件交换系统…

第7章 硬件测试-7.1 硬件调试

第7章 硬件测试 7.1 硬件调试7.1.1 电路检查7.1.2 电源调试7.1.3 时钟调试7.1.4 主芯片及外围小系统调试7.1.5 存储器件和串口外设调试7.1.6 其他功能模块调试 测试是每项成功产品的必经环节。硬件测试是评估产品质量的重要方法&#xff0c;产品质量是公司的信誉和品牌象征&…

Qt5/QPainter/画家

目录 1.绘制文字 1.1案例 1.2代码 2.画线 2.1案例 2.2代码 3.绘制矩形 3.1代码 4.绘制椭圆和圆 4.1椭圆 4.2圆 5.圆弧 5.1案例: 5.2代码 6.扇形 6.1案例 6.2代码: 7.更改绘画的颜色和粗细 7.1案例 ​编辑 7.2代码 1.绘制文字 1.1案例 通过三种不同的绘…

一篇保姆式centos/unbantu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;unbantu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest do…

fetch API和XHR

文章目录 一、基本写法1. XMLHttpRequest&#xff08;XHR&#xff09;2. Fetch API 二、兼容性1. XMLHttpRequest&#xff08;XHR&#xff09;2. Fetch API 三、Promise支持1. XMLHttpRequest&#xff08;XHR&#xff09;2. Fetch API 四、请求响应1. XMLHttpRequest&#xff0…

Photoshop(PS)——人像磨皮

1.新建一个文件&#xff0c;背景为白色&#xff0c;将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来&#xff0c;选择第一个拷贝图层&#xff0c;选择滤镜---杂色---蒙尘与划痕 3.调整一下数值&#xff0c;大概能够模糊痘印痘坑&#xff0c;点击确定。 4.然后选择拷贝2图层…

Elasticsearch retrievers 通常与 Elasticsearch 8.16.0 一起正式发布!

作者&#xff1a;来自 Elastic Panagiotis Bailis Elasticsearch 检索器经过了重大改进&#xff0c;现在可供所有人使用。了解其架构和用例。 在这篇博文中&#xff0c;我们将再次深入探讨检索器&#xff08;retrievers&#xff09;。我们已经在之前的博文中讨论过它们&#xf…

《设计模式》创建型模式总结

目录 创建型模式概述 Factory Method: 唯一的类创建型模式 Abstract Factory Builder模式 Prototype模式 Singleton模式 最近在参与一个量化交易系统的项目&#xff0c;里面涉及到用java来重构部分vnpy的开源框架&#xff0c;因为是框架的搭建&#xff0c;所以会涉及到像…