项目结构:
/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Template Method 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/25 10:09 # User : geovindu # Product : GoLand # Project : godesginpattern # File : jewelry_template.go */ package template import ( "fmt" "godesginpattern/templatemethod/entity" ) // 珠宝制作模板(算法骨架) type JewelryTemplate struct { jewelry entity.Jewelry // 依赖接口,面向抽象编程 } // NewJewelryTemplate 构造函数(企业级必须用构造函数) func NewJewelryTemplate(j entity.Jewelry) *JewelryTemplate { return &JewelryTemplate{jewelry: j} } // Make 模板方法:对外暴露标准制作流程 func (t *JewelryTemplate) Make() { t.selectMaterial() // 1. 选材(通用) fmt.Println(t.jewelry.Shaping()) // 2. 塑形(可变) t.polish() // 3. 打磨(通用) fmt.Println(t.jewelry.Inlay()) // 4. 镶嵌(可变) t.qualityCheck() // 5. 质检(通用) t.finish() // 6. 成品(通用) } // 以下为 通用步骤(私有方法,禁止外部调用) func (t *JewelryTemplate) selectMaterial() { fmt.Println("[通用] 选材:甄选贵金属与天然宝石") } func (t *JewelryTemplate) polish() { fmt.Println("[通用] 打磨:镜面抛光处理") } func (t *JewelryTemplate) qualityCheck() { fmt.Println("[通用] 质检:符合国家珠宝生产标准") } func (t *JewelryTemplate) finish() { fmt.Println("[通用] 成品:防伪编码 + 礼盒包装\n") }/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Template Method 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/25 10:09 # User : geovindu # Product : GoLand # Project : godesginpattern # File : jewelry.go */ package entity // 珠宝接口:仅约束可变步骤 type Jewelry interface { Shaping() string // 塑形 Inlay() string // 镶嵌 }/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Template Method 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/25 10:09 # User : geovindu # Product : GoLand # Project : godesginpattern # File : ring.go */ package service import "fmt" // Ring 戒指:实现 entity.Jewelry 接口 type Ring struct{} func NewRing() *Ring { return &Ring{} } func (r *Ring) Shaping() string { return fmt.Sprintf("[可变] 戒指塑形:标准戒圈成型") } func (r *Ring) Inlay() string { return fmt.Sprintf("[可变] 戒指镶嵌:单颗主石爪镶工艺") } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Template Method 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/25 10:10 # User : geovindu # Product : GoLand # Project : godesginpattern # File : necklace.go */ package service import "fmt" // Necklace 项链 type Necklace struct{} func NewNecklace() *Necklace { return &Necklace{} } func (n *Necklace) Shaping() string { return fmt.Sprintf("[可变] 项链塑形:链条压制成型") } func (n *Necklace) Inlay() string { return fmt.Sprintf("[可变] 项链镶嵌:碎钻群镶点缀") } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Template Method 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/25 10:10 # User : geovindu # Product : GoLand # Project : godesginpattern # File : bracelet.go */ package service import "fmt" // Bracelet 手镯 type Bracelet struct{} func NewBracelet() *Bracelet { return &Bracelet{} } func (b *Bracelet) Shaping() string { return fmt.Sprintf("[可变] 手镯塑形:宽版镯身压铸") } func (b *Bracelet) Inlay() string { return fmt.Sprintf("[可变] 手镯镶嵌:侧边排镶宝石") }调用:
/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Template Method 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/25 10:13 # User : geovindu # Product : GoLand # Project : godesginpattern # File : templatemethodbll.go templatemethod/ ├── go.mod # 项目模块 ├── internal/ # 内部包(外部不可访问) │ ├── template/ # 模板层(算法骨架 + 通用步骤) │ │ └── jewelry_template.go │ ├── entity/ # 实体/接口层(定义约束) │ │ └── jewelry.go │ └── service/ # 业务实现层(可变步骤具体实现) │ ├── ring.go │ ├── necklace.go │ └── bracelet.go └── main.go # 入口调用层 */ package bll import ( "fmt" "godesginpattern/templatemethod/service" "godesginpattern/templatemethod/template" ) func TemplateMethodMain() { fmt.Println("=== 企业级珠宝制作系统 ===") // 制作戒指 ring := service.NewRing() template.NewJewelryTemplate(ring).Make() // 制作项链 necklace := service.NewNecklace() template.NewJewelryTemplate(necklace).Make() // 制作手镯 bracelet := service.NewBracelet() template.NewJewelryTemplate(bracelet).Make() }输出: