go: Singleton Pattern

项目结构:

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()
}

输出:

相关推荐
tachibana213 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
王中阳Go14 小时前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型
for_ever_love__20 小时前
LangChain Agentic RAG:让 Agent 自己决定要不要检索、检索几次
人工智能·golang·langchain·rag·langgraph·agentic·自适应检索
范中勤20 小时前
技术文档:模型工厂 `llm_provider` / `llm_use` 分层设计
设计模式·langchain·架构设计·模型工厂·llm_provider
谢亮_vipxieliang21 小时前
Go gRPC基础与实战
开发语言·后端·golang
徐小黑ACG1 天前
Golang goroutine、通道、锁
开发语言·后端·golang
浅尝辄止;1 天前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#
范中勤1 天前
适配器模式(Adapter Pattern):原理、场景与 LLM 多厂商工程落地
设计模式·架构·langchain·适配器模式·多厂商
从琳开始9891 天前
[JavaEE]多线程初阶(下篇)------多线程案例(单例模式,阻塞队列,线程池,定时器)
java·单例模式·java-ee
408高手1 天前
23种设计模式
设计模式