当前位置: 首页 > news >正文

go: Singleton Pattern

项目结构:

image

 

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Singleton Pattern 单例模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/19 14:56
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : certificate.go
*/
package model// 珠宝鉴定证书模型
type Certificate struct {CertNo   string // 唯一证书编号Jewelry  string // 珠宝名称Material string // 材质Weight   string // 重量
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Singleton Pattern 单例模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/19 14:57
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : inventory.go
*/
package model// 珠宝库存
type Inventory struct {SKU   string // 唯一SKUName  string // 名称Stock int    // 库存数量
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Singleton Pattern 单例模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/19 14:57
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : points.go
*/
package model// 积分记录
type PointsRecord struct {UserID intAmount float64Points int
}

 

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Singleton Pattern 单例模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/19 14:57
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : singleton.go
*/
package serviceimport "sync"// Singleton 全局单例工厂
// 持有所有全局唯一的业务服务
type Singleton struct {CertService      CertificateServiceInventoryService InventoryServicePointsService    PointsService
}// 私有单例实例
var singleton *Singleton
var once sync.Once// NewSingleton 初始化全局单例工厂(只执行一次)
func NewSingleton() *Singleton {once.Do(func() {// 初始化所有单例服务singleton = &Singleton{CertService:      NewCertificateServiceImpl(),InventoryService: NewInventoryServiceImpl(),PointsService:    NewPointsServiceImpl(),}})return singleton
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Singleton Pattern 单例模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/19 14:58
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : cert.go
*/
package serviceimport ("godesginpattern/singleton/model""strconv""sync"
)// CertificateService 证书服务接口(职责单一:生成唯一证书)
type CertificateService interface {Generate(jewelry, material, weight string) *model.Certificate
}// CertificateServiceImpl 实现类(单例)
type CertificateServiceImpl struct {lastNo intmu     sync.Mutex
}func NewCertificateServiceImpl() *CertificateServiceImpl {return &CertificateServiceImpl{lastNo: 10000}
}// Generate 生成唯一证书(线程安全)
func (c *CertificateServiceImpl) Generate(jewelry, material, weight string) *model.Certificate {c.mu.Lock()defer c.mu.Unlock()c.lastNo++certNo := "ZB-" + strconv.Itoa(c.lastNo)return &model.Certificate{CertNo:   certNo,Jewelry:  jewelry,Material: material,Weight:   weight,}
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Singleton Pattern 单例模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/19 15:00
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : jewelry_api.go
*/
package apiimport ("fmt""godesginpattern/singleton/model""godesginpattern/singleton/service"
)// UseSingleton 使用全局单例(修复格式化输出)
func UseSingleton() {// 全局唯一入口s := service.NewSingleton()// 1. 生成证书(整洁输出)fmt.Println("=== 珠宝鉴定证书生成 ===")cert := s.CertService.Generate("钻石戒指", "18K金+天然钻石", "1.2ct")printCertificate(cert)// 2. 操作库存fmt.Println("\n=== 珠宝库存管理 ===")s.InventoryService.AddStock("DIAMOND-RING-001", "钻石戒指", 5)stock := s.InventoryService.GetStock("DIAMOND-RING-001")fmt.Printf("SKU: %s | 当前库存:%d\n", "DIAMOND-RING-001", stock)// 3. 积分结算fmt.Println("\n=== 会员积分结算 ===")points := s.PointsService.Calculate(1001, 5999)printPointsRecord(points)
}// printCertificate 证书格式化输出
func printCertificate(c *model.Certificate) {fmt.Printf("证书编号:%s\n", c.CertNo)fmt.Printf("珠宝名称:%s\n", c.Jewelry)fmt.Printf("材质:%s\n", c.Material)fmt.Printf("重量:%s\n", c.Weight)
}// printPointsRecord 积分记录格式化输出
func printPointsRecord(p *model.PointsRecord) {fmt.Printf("用户ID:%d\n", p.UserID)fmt.Printf("消费金额:%.2f 元\n", p.Amount)fmt.Printf("获得积分:%d\n", p.Points)
}

  

调用:

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/19 15:22
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : singletonbll.go
核心设计原则
所有单例统一管理:一个 Singleton 工厂持有所有全局唯一服务
接口化编程:Service 全部定义接口,方便扩展、替换、测试
严格分层:
API:处理请求
Service:业务逻辑(单例)
Repository:数据读写
Model:数据结构
线程安全:使用 sync.Once 初始化 + 内部锁保护共享数据
禁止直接 new:外部只能通过工厂获取单例,保证全局唯一singleton/
├── cmd/                    # 程序入口
├── internal/               # 内部业务(禁止外部引用)
│   ├── model/              # 数据模型
│   ├── repository/         # 数据存储层(DB/缓存)
│   ├── service/            # 业务逻辑层(单例核心)
│   │   ├── cert.go         # 证书编号生成服务(单例)
│   │   ├── inventory.go    # 库存管理服务(单例)
│   │   ├── points.go        # 积分结算服务(单例)
│   │   └── singleton.go    # 全局单例工厂(统一管理)
│   └── api/                # HTTP API 层
├── pkg/                    # 公共工具
└── go.mod
*/
package bllimport "godesginpattern/singleton/api"func SingletonMain() {// 全局唯一单例系统启动api.UseSingleton()
}

  

输出:

image

 

 

 

 

 

 

 

http://www.jsqmd.com/news/667191/

相关文章:

  • 别再只用ping了!用iperf3给你的CentOS 7服务器做个专业‘体检’(附TCP/UDP带宽测试对比)
  • 别再只盯着堆叠配置了!深入聊聊H3C IRF中MAD的‘健康检查’与‘竞选’机制如何保业务
  • 底部固定U1,U2
  • Kandinsky-5.0-I2V-Lite-5s企业级应用:Java后端服务集成指南
  • SDX62平台编译Lighttpd时,BitBake反复报‘Reconnecting to server...’的快速解决手册
  • 从USB 2.0到USB 3.x:Synopsys SVT USB VIP配置避坑与接口选择指南
  • 20251905 2025-2026-2 《网络攻防实践》实验五
  • 告别单屏!详解LT8712SX的MST功能:如何让一个Type-C口轻松驱动两台4K显示器
  • ERA5-Land 逐小时累积数据:从单位换算到日值提取的实战避坑指南
  • 别再死记硬背公式了!用Python+HFSS快速仿真偶极子天线(从半波到宽带)
  • 从手机屏幕到相机传感器:MIPI CSI-2协议中RGB与RAW格式的实战选择指南
  • 从零搭建一个后台管理页:手把手教你用Avue-Crud配置增删改查(Vue3 + Element Plus版)
  • Unity URP卡通渲染实战:从零构建专业级动漫风格着色器
  • 前端安全防护实战
  • AGI可靠性如何验证?:5类致命幻觉检测框架+实时监控SOP(附开源工具链)
  • 别只刷题了!用这10个经典C语言案例,真正理解计算机思维(附杭电真题解析)
  • AI教材生成大揭秘!低查重AI工具,轻松搞定教材编写难题
  • QT开发跨平台气象应用:集成伏羲模型支持Windows、macOS和Linux
  • 从TeX Live到TeXstudio:我的本地LaTeX环境搭建与高效写作配置全记录
  • 栈与单调栈基础原理与题目说明
  • 从‘收音机’到‘高速相机’:一文看懂频谱仪工作原理与选型避坑(扫频/FFT/实时)
  • 从Datasheet到Allegro可生产封装:一个硬件工程师的标准化建库自查清单
  • 在Windows上运行macOS虚拟机的完整指南:OSX-Hyper-V项目深度解析
  • Sass安装报错?别急着降级Node!一个命令搞定环境检测与版本匹配
  • DVWA实战:从零到一,手把手拆解SQL手工注入全流程
  • MIPI CSI-2笔记(23) -- 从PPI接口到数据流:一个RAW8传输的D-PHY实现剖析
  • 基于51单片机的CO2浓度智能监测与自适应报警系统设计
  • FreeRTOS任务优先级设置指南:以温湿度监测和LED控制为例(避坑分享)
  • Mos:重塑Mac鼠标滚动体验的智能平滑引擎
  • IWR6843ISK原始ADC数据捕获与解析实战:从二进制文件到信号矩阵