项目结构:

Go
/*
# 版权所有 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")
}
Go
/*
# 版权所有 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 // 镶嵌
}
Go
/*
# 版权所有 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("[可变] 手镯镶嵌:侧边排镶宝石")
}
调用:
Go
/*
# 版权所有 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()
}
输出:
