项目结构:

Go
/*
# 版权所有 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 // 唯一SKU
Name 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 int
Amount float64
Points int
}
Go
/*
# 版权所有 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 service
import "sync"
// Singleton 全局单例工厂
// 持有所有全局唯一的业务服务
type Singleton struct {
CertService CertificateService
InventoryService InventoryService
PointsService 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 service
import (
"godesginpattern/singleton/model"
"strconv"
"sync"
)
// CertificateService 证书服务接口(职责单一:生成唯一证书)
type CertificateService interface {
Generate(jewelry, material, weight string) *model.Certificate
}
// CertificateServiceImpl 实现类(单例)
type CertificateServiceImpl struct {
lastNo int
mu 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,
}
}
Go
/*
# 版权所有 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 api
import (
"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)
}
调用:
Go
/*
# 版权所有 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 bll
import "godesginpattern/singleton/api"
func SingletonMain() {
// 全局唯一单例系统启动
api.UseSingleton()
}
输出:
