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

go: Flyweight Pattern

 

项目结构:

image

 

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Flyweight 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/20 21:00
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : jewelry_category.go
*/
package flyweightimport ("fmt""godesginpattern/flyweight/errors"
)// JewelryCategoryFlyweight 享元接口(共享内部状态)
type JewelryCategoryFlyweight interface {CategoryID() stringCategoryName() stringMaterial() stringStyle() stringBasePrice() float64BaseInfo() string
}// jewelryCategory 实现
type jewelryCategory struct {categoryID   stringcategoryName stringmaterial     stringstyle        stringbasePrice    float64
}func (j *jewelryCategory) CategoryID() string   { return j.categoryID }
func (j *jewelryCategory) CategoryName() string { return j.categoryName }
func (j *jewelryCategory) Material() string     { return j.material }
func (j *jewelryCategory) Style() string        { return j.style }
func (j *jewelryCategory) BasePrice() float64   { return j.basePrice }func (j *jewelryCategory) BaseInfo() string {return fmt.Sprintf("品类ID:%s | 名称:%s | 材质:%s | 款式:%s | 基础价:%.2f",j.categoryID, j.categoryName, j.material, j.style, j.basePrice)
}// NewJewelryCategory 创建享元
func NewJewelryCategory(id, name, material, style string, basePrice float64) (JewelryCategoryFlyweight, error) {if id == "" {return nil, errors.ErrCategoryEmpty}return &jewelryCategory{categoryID:   id,categoryName: name,material:     material,style:        style,basePrice:    basePrice,}, nil
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Flyweight 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/20 21:00
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : inventory.go
*/
package inventoryimport ("fmt""godesginpattern/flyweight/domain/flyweight"
)type JewelryStatus stringconst (StatusOnSale  JewelryStatus = "在售"StatusSoldOut JewelryStatus = "已售罄"StatusOffline JewelryStatus = "已下架"
)// JewelryInventory 库存实体(外部状态)
type JewelryInventory struct {UniqueCode stringStockNum   intOnlineTime stringSalePrice  float64Status     JewelryStatusCategory   flyweight.JewelryCategoryFlyweight
}func (j *JewelryInventory) FullInfo() string {return fmt.Sprintf("[%s] %s | 唯一码:%s | 库存:%d | 售价:%.2f | 状态:%s",j.Category.CategoryID(), j.Category.BaseInfo(),j.UniqueCode, j.StockNum, j.SalePrice, j.Status,)
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Flyweight 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/20 20:59
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : category_factory.go
*/
package factoryimport ("context""godesginpattern/flyweight/domain/flyweight""log""sync"
)// FlyweightFactory 享元工厂接口
type FlyweightFactory interface {GetCategory(ctx context.Context, req NewCategoryReq) (flyweight.JewelryCategoryFlyweight, error)Count() int
}type NewCategoryReq struct {CategoryID   stringCategoryName stringMaterial     stringStyle        stringBasePrice    float64
}// categoryFactory 实现
type categoryFactory struct {mu    sync.RWMutexcache map[string]flyweight.JewelryCategoryFlyweight
}func NewCategoryFactory() FlyweightFactory {return &categoryFactory{cache: make(map[string]flyweight.JewelryCategoryFlyweight),}
}func (f *categoryFactory) GetCategory(ctx context.Context, req NewCategoryReq) (flyweight.JewelryCategoryFlyweight, error) {f.mu.RLock()cate, ok := f.cache[req.CategoryID]f.mu.RUnlock()if ok {log.Printf("[工厂] 复用品类:%s", req.CategoryID)return cate, nil}f.mu.Lock()defer f.mu.Unlock()if cate, ok = f.cache[req.CategoryID]; ok {return cate, nil}newCate, err := flyweight.NewJewelryCategory(req.CategoryID, req.CategoryName, req.Material, req.Style, req.BasePrice,)if err != nil {return nil, err}f.cache[req.CategoryID] = newCatelog.Printf("[工厂] 创建新品类:%s", req.CategoryID)return newCate, nil
}func (f *categoryFactory) Count() int {f.mu.RLock()defer f.mu.RUnlock()return len(f.cache)
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Flyweight 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/20 20:59
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : inventory_service.go
*/
package serviceimport ("context""godesginpattern/flyweight/domain/flyweight""godesginpattern/flyweight/domain/inventory""godesginpattern/flyweight/errors""log"
)// InventoryService 库存服务接口
type InventoryService interface {CreateInventory(ctx context.Context, req CreateInventoryReq) *inventory.JewelryInventoryQuery(ctx context.Context, inv *inventory.JewelryInventory) stringSaleOut(ctx context.Context, inv *inventory.JewelryInventory, num int) error
}type CreateInventoryReq struct {UniqueCode stringOnlineTime stringSalePrice  float64Category   flyweight.JewelryCategoryFlyweight
}// inventoryService 实现
type inventoryService struct{}func NewInventoryService() InventoryService {return &inventoryService{}
}func (s *inventoryService) CreateInventory(ctx context.Context, req CreateInventoryReq) *inventory.JewelryInventory {return &inventory.JewelryInventory{UniqueCode: req.UniqueCode,StockNum:   1,OnlineTime: req.OnlineTime,SalePrice:  req.SalePrice,Status:     inventory.StatusOnSale,Category:   req.Category,}
}func (s *inventoryService) Query(ctx context.Context, inv *inventory.JewelryInventory) string {return inv.FullInfo()
}func (s *inventoryService) SaleOut(ctx context.Context, inv *inventory.JewelryInventory, num int) error {if inv.StockNum < num {return errors.ErrStockNotEnough}inv.StockNum -= numif inv.StockNum == 0 {inv.Status = inventory.StatusSoldOut}log.Printf("[销售] 出库成功:%s 剩余:%d", inv.UniqueCode, inv.StockNum)return nil
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Flyweight 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/20 20:59
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : jewelry_api.go
*/
package apiimport ("context""fmt""godesginpattern/flyweight/config""godesginpattern/flyweight/domain/inventory""godesginpattern/flyweight/infrastructure/factory""godesginpattern/flyweight/service"
)// JewelryAPI 对外接口层
type JewelryAPI struct {config  *config.AppConfigfactory factory.FlyweightFactoryservice service.InventoryService
}func NewJewelryAPI(cfg *config.AppConfig,f factory.FlyweightFactory,s service.InventoryService,
) *JewelryAPI {return &JewelryAPI{config:  cfg,factory: f,service: s,}
}// BatchCreate 批量创建库存
func (api *JewelryAPI) BatchCreate(ctx context.Context, req factory.NewCategoryReq, count int) ([]*inventory.JewelryInventory, error) {cate, err := api.factory.GetCategory(ctx, req)if err != nil {return nil, err}var list []*inventory.JewelryInventoryfor i := 1; i <= count; i++ {inv := api.service.CreateInventory(ctx, service.CreateInventoryReq{UniqueCode: fmt.Sprintf("JM%06d", i),OnlineTime: "2025-01-10",SalePrice:  cate.BasePrice() - 300,Category:   cate,})list = append(list, inv)}return list, nil
}

 

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Flyweight 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/20 21:00
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : config.go
*/
package configtype AppConfig struct {AppName stringVersion string
}func NewDefaultConfig() *AppConfig {return &AppConfig{AppName: "jewelry-inventory-system",Version: "v1.0.0",}
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Flyweight 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/20 20:59
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : errors.go
*/
package errorsimport "errors"var (ErrStockNotEnough = errors.New("库存不足")ErrCategoryEmpty  = errors.New("品类ID不能为空")
)

  

调用:

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Flyweight 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/20 21:03
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : flyweightbll.go
flyweight/
├── go.mod                  # Go 模块
├── cmd/
│   └── main.go             # 项目启动入口
├── config/
│   └── config.go           # 应用配置
├── domain/
│   ├── flyweight/
│   │   └── jewelry_category.go  # 享元(共享内部状态)
│   └── inventory/
│       └── inventory.go    # 库存实体(外部状态)
├── infrastructure/
│   └── factory/
│       └── category_factory.go   # 享元工厂(缓存/复用)
├── service/
│   └── inventory_service.go      # 业务逻辑层
├── api/
│   └── jewelry_api.go            # 对外接口/流程编排
└── common/└── errors/└── errors.go       # 全局统一错误
*/
package bllimport ("context""godesginpattern/flyweight/api""godesginpattern/flyweight/config""godesginpattern/flyweight/infrastructure/factory""godesginpattern/flyweight/service""log"
)func FlyweightMain() {ctx := context.Background()cfg := config.NewDefaultConfig()// 依赖注入f := factory.NewCategoryFactory()s := service.NewInventoryService()api := api.NewJewelryAPI(cfg, f, s)log.Println("=== 珠宝库存销售系统启动 ===")// 创建10000件钻戒diamond, _ := api.BatchCreate(ctx, factory.NewCategoryReq{CategoryID:   "C001",CategoryName: "钻戒",Material:     "18K金",Style:        "经典六爪",BasePrice:    5999,}, 10000)// 创建5000件黄金项链gold, _ := api.BatchCreate(ctx, factory.NewCategoryReq{CategoryID:   "C002",CategoryName: "黄金项链",Material:     "足金999",Style:        "简约锁骨链",BasePrice:    2999,}, 5000)log.Printf("总库存:%d", len(diamond)+len(gold))log.Printf("共享享元对象:%d", f.Count())// 查询 & 销售log.Println("\n=== 库存查询 ===")log.Println(s.Query(ctx, diamond[0]))log.Println("\n=== 销售出库 ===")_ = s.SaleOut(ctx, diamond[0], 1)log.Println(s.Query(ctx, diamond[0]))
}

  

输出:

image

 

 

 

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

相关文章:

  • Android开发避坑指南:OkHttp3.14+导入时别忘了配置network_security_config.xml
  • 基于KITTI数据集:从LIO-SAM部署到EVO精度评估全流程解析
  • 保姆级教程:用VMware Workstation Pro搭建CFS三层靶场(附宝塔面板配置与网络排错)
  • 【AI面试八股文 Vol.1.1 | 专题6:Checkpoint 机制】Checkpoint机制:状态持久化与断点恢复
  • #官方认证|2026年长三角1大正规通道闸公司排名,上海苏州嘉兴等地骏通智能综合实力遥遥领先 - 十大品牌榜
  • 理性择校:合肥雅思机构排名视角下,哪个更值得优选 - 资讯焦点
  • 【AI大模型】一文读懂预训练语言模型:从原理到应用
  • 强化学习1——初步理解PPO
  • 租天下实业携手卓越前海壹号,0佣金服务赋能湾区企业选址 - 品牌企业推荐师(官方)
  • 训练时train loss和val loss的‘爱恨情仇’:从曲线看懂模型到底在干嘛(附调参实战)
  • 2026年数控折弯机厂家实力推荐:电液/纯电/数控折弯机及模具专业品牌深度解析与选购指南 - 品牌推荐用户报道者
  • 易语言内核驱动读写工具|Drv驱动模块支持进程保护与内存操作(Win7-Win11离线版)
  • 卧室香薰避坑指南:科学选择让深睡不再是难题 - 资讯焦点
  • 重庆地区高压电工证培训机构推荐 - 品牌企业推荐师(官方)
  • 租天下实业携手前海自贸中心,0佣金专业选址赋能湾区企业 - 品牌企业推荐师(官方)
  • 强化学习2——初步理解DPO
  • 构建ClaudeAgent:Worktree+任务隔离
  • 2026 燕郊音乐艺考机构哪家好?5 家热门机构深度对比,三河音乐艺考哪家好 - 品牌企业推荐师(官方)
  • 深圳南山科技核心地标——深圳软件产业基地写字楼全面解析 - 品牌企业推荐师(官方)
  • 如何解决AI对于图片识别大小问题
  • 手把手打造LVGL智能家居控制面板:从密码输入到键盘联动的Text Area全应用
  • kolla-ansible部署openstacl
  • 驾考宝典在线考试系统
  • AI驱动浏览器自动化测试:零脚本实操指南
  • Zotero浏览器插件:终极免费文献管理解决方案的完整指南
  • #官方认证|2026年江浙沪长三角一大正规停车场公司排名,骏通智能综合实力遥遥领先 - 十大品牌榜
  • 为什么顶尖科技公司已在内部停用“程序员”职称?2026奇点大会披露的4项能力淘汰清单
  • deepseek对于图片中坐标位置判定效果非常差
  • 2026年激光切割机厂家TOP推荐:管材/板管一体激光切割机品牌,高效精密加工解决方案深度解析 - 品牌推荐用户报道者
  • 第二篇:Vibe Coding 深度解析(二):支撑范式落地的核心技术架构文章