【常见的设计模式】单例模式

参考:【设计模式专题之单例模式】1.小明的购物车

【设计模式专题之单例模式】
1.小明的购物车 时间限制:1.000S 空间限制:256MB

题目描述
小明去了一家大型商场,拿到了一个购物车,并开始购物。请你设计一个购物车管理器,记录商品添加到购物车的信息(商品名称和购买数量),并在购买结束后打印出商品清单。(在整个购物过程中,小明只有一个购物车实例存在)。

输入描述
输入包含若干行,每行包含两部分信息,分别是商品名称和购买数量。商品名称和购买数量之间用空格隔开。

输出描述
输出包含小明购物车中的所有商品及其购买数量。每行输出一种商品的信息,格式为 “商品名称 购买数量”。

输入示例
Apple 3 Banana 2 Orange 5

输出示例
Apple 3 Banana 2 Orange 5

提示信息

  • 本道题目请使用单例设计模式
  • 使用私有静态变量来保存购物车实例
  • 使用私有构造函数防止外部直接实例化

思路:

  • 单例实现,借助Golang中的 sync.Once 包 和 全局变量 实现
  • 先实现几个必要结构实例方法,结构体 如:商品信息、购物车信息;实例 如:购物车实例;方法 如:SetGet方法。

注意:

  • Set方法,需要修改接收器指向的购物车中的商品信息,因此需要使用指针接收器
  • Get方法,需要读取购物车中的商品信息,无需修改,所以可以使用接收器。这样在调用Get方法时,会创建接收器的副本,而不会影响原始购物车实例。
  • main方法,外部自定义格式的输入方式,应由外部处理,而不应放入Set方法中处理,避免Set方法因外部输入格式变动而频繁改动

Golang版本代码:

package mainimport (
"fmt"
"sync"
)// 单例 全局变量
var (instance *ShoppingCartInfoonce     sync.Once
)// ProductInfo 商品信息
type ProductInfo struct {Name     stringQuantity int
}// ShoppingCart 购物车信息
type ShoppingCartInfo struct {shoppingCart []ProductInfo
}// NewInstance 新建购物车实例
func NewInstance() *ShoppingCartInfo {once.Do(func() {instance = &ShoppingCartInfo{shoppingCart: make([]ProductInfo, 0),}})return instance
}// Set 添加购物车商品信息
// Set方法,需要修改接收器指向的购物车中的商品信息,因此需要使用指针接收器
func (m *ShoppingCartInfo) Set(info ProductInfo) {m.shoppingCart = append(m.shoppingCart, info)
}// Get 获取购物车商品信息
// Get方法,需要读取购物车中的商品信息,无需修改,所以可以使用值接收器。
// 这样在调用Get方法时,会创建接收器的副本,而不会影响原始购物车实例。
func (m ShoppingCartInfo) Get() {for _, info := range m.shoppingCart {fmt.Println(info.Name, info.Quantity)}
}// main
func main() {ins := NewInstance()name, quantity := "", 0// 模拟多次添加购物车商品for {// 外部自定义格式的输入方式,应由外部处理,而不应放入Set方法中处理,避免Set方法因外部输入格式变动而频繁改动if _, err := fmt.Scanf("%s %d", &name, &quantity); err != nil {break}ins.Set(ProductInfo{Name:     name,Quantity: quantity,})}// 最后一次性获取购物车所有商品信息ins.Get()
}

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

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

相关文章

【React】基础数据回填--useForm与setFieldsValue详解

相关属性 1.form 2.setFieldsValue 代码 import{Form }from"antd";const Publish =

体积大的快递怎么寄便宜?如何寄件寄包裹更省钱?

大学毕业了,面对即将到来的工作生活,小李不得不把宿舍里的大包小包打包寄回家。可是,当他真正开始打包行李时,才发现这可不是一件简单的事:衣服、被子、书籍、杂物……这些东西加起来体积不小,想要省钱寄快…

虚拟化技术 DeskV(或Desktop Virtualization)

DeskV(或Desktop Virtualization),即桌面虚拟化技术,是一种将计算机的桌面系统(包括操作系统、应用程序和用户数据)进行虚拟化,以实现桌面使用的安全性和灵活性的技术。以下是关于DeskV&#xf…

基于stm32单片机的智能手环的设计

摘 要 随着科技的飞速发展和人们生活水平的提高,健康与科技日益融合,智能可穿戴设备已成为现代人生活中不可或缺的一部分。智能手环,作为一种便携、实用且功能丰富的可穿戴设备,受到越来越多用户的喜爱。它不仅能够实时监测用户的…

简化嵌入式Linux开发:在Ubuntu上安装和配置交叉编译环境的高效方法

在嵌入式Linux开发中,我们通常需要在Ubuntu上安装交叉编译工具链,并配置相关文件。编译过程中,如果遇到依赖库问题,还需要手动查找并编译开源源码。这些步骤较为繁琐,为了简化操作,我们可以尝试以下方案&am…

深度解析:银行小额支付与大额支付的关键区别与应用场景

一、交易金额 小额支付:通常适用于金额在5万元以下的支付场景。这种支付方式更适合个人用户或小额交易场景,如便利店购物、支付停车费、小额汇款等。大额支付:涉及金额较大的支付交易,一般被定义为单笔交易金额超过一定数额&…

特殊的“user profile service服务登录失”情况

记录一下比较特殊的user profile service服务登录失败情况 公司电脑,某次之后每次来公司电脑开机后就会出现这个情况,后来发现只要是关机后再开机百分百出现,重启就不会,一开始也百度、google了,网上有很多解决方式&am…

DropNotch for Mac v1.0.1 在 Mac 刘海快速使用 AirDrop

应用介绍 DropNotch 是一款专为Mac设计的应用程序,可以将MacBook的凹口区域(刘海)转换为文件放置区。 功能特点 文件共享: 用户可以将文件拖放到MacBook的凹口区域,并通过AirDrop、邮件、消息等方式轻松共享。多显示器支持: 即…

.Net C#执行JavaScript脚本

文章目录 前言一、安装二、执行 JavaScript 脚本三、与脚本交互四、JS 调用 C# 方法五、多线程使用总结 前言 ClearScript 是一个 .NET 平台下的开源库,用于在 C# 和其他 .NET 语言中执行脚本代码。它提供了一种方便和安全的方法来将脚本与应用程序集成,…

PHP酒店宾馆民宿多商户版系统小程序源码

解锁酒店新境界!揭秘多商户版系统的无限可能🏨✨ 🚀 开篇:酒店业的新革命,多商户版系统来袭! 你是否梦想过将你的酒店打造成一个集餐饮、娱乐、购物于一体的综合型休闲空间?现在,这…

【linux】服务器卸载cuda

【linux】服务器卸载cuda 文章目录 【linux】服务器卸载cuda1、查找已安装的 CUDA 包:2、卸载 CUDA:3、删除残留文件4、更新系统的包索引:5、检查是否卸载干净: 1、查找已安装的 CUDA 包: dpkg -l | grep cuda2、卸载…

【JavaScript】深入理解Promise:从基础概念到进阶用法、手写promise

🔥 个人主页:空白诗 文章目录 一、引言二、Promise概述1. Promise的定义2. Promise的用途3. Promise的三种状态4. Promise的构造函数和基础结构5. Promise的优点6. Promise的实例方法7. Promise的静态方法 三、Promise的基本用法1. 创建一个Promise2. th…

The First项目报告:引领L2解决方案新纪元的模块化协议AltLayer

在区块链演进中,可扩展性与定制化成为开发者核心诉求。ZK Rollups与Optimistic Rollups虽显著提升以太坊等区块链性能,却面临访问性、定制难、中心化风险及流动性分散等挑战。AltLayer以Rollups-as-a-Service创新模式,赋予开发者直接管理roll…

python class

继承 看下Python中继承的语法&#xff1a; class DerivedClassName(BaseClassName):<statement-1>...<statement-N>复制代码 如果基类定义在另一个模块中的时候&#xff1a; class DerivedClassName(modname.BaseClassName):

【漏洞复现】飞企互联-FE企业运营管理平台——uploadAttachmentServlet——文件上传

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据…

Linux用户和用户组的创建和添加

创建用户组 在Linux中创建用户组&#xff0c;您可以使用groupadd命令&#xff0c;后跟用户组名称。例如&#xff0c;要创建一个名为newgroup的用户组&#xff0c;您可以执行以下命令&#xff1a; sudo groupadd newgroup创建用户 创建用户&#xff0c;您可以使用useradd命令&am…

平安养老险山西分公司开展2024年“7.8全国保险公众宣传日”活动

为深入贯彻新发展理念和中央金融工作会议、中央经济工作会议精神&#xff0c;推动保险行业形象持续向好&#xff0c;根据中保协《关于印发<2024年“7.8全国保险公众宣传日”活动方案>的通知》和山西省保险行业协会《山西保险业2024年“7.8全国保险公众宣传日”活动方案》…

在误装Windows server2019 后如何利用Windows.old恢复?

&#x1f3c6;本文收录于《CSDN问答解惑》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

DevExpress(WinForms WPF)中文教程 - 如何减小文档文件大小?

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress近期重要版本v24.1已正式发布&#xff0c;该版本拥有众多新产…

PlugLink 与 AI 大模型:深入 COZE API 链接实践(附源码)

在这个技术日新月异的时代&#xff0c;AI 不再是遥不可及的概念&#xff0c;而是逐渐成为我们日常生活与工作中不可或缺的一部分。作为技术领域的探路者&#xff0c;我深感荣幸地向大家介绍 PlugLink —— 一个旨在简化 AI 应用集成并促进跨领域协作的开源平台&#xff0c;以及…