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

Go语言设计模式:创建型模式

Go语言设计模式:创建型模式

一、设计模式概述

设计模式是软件设计中反复出现问题的解决方案。Go语言作为一种现代化的编程语言,同样可以应用经典的设计模式。

Go语言中的设计模式特点

  1. 接口优先:通过接口实现解耦
  2. 组合优于继承:Go不支持继承,使用组合实现代码复用
  3. 并发安全:考虑并发场景下的设计
  4. 简洁性:避免过度设计

二、单例模式

单例模式确保一个类只有一个实例,并提供全局访问点。

饿汉式单例

package singleton import "sync" type Singleton struct { data string } var instance *Singleton var once sync.Once func GetInstance() *Singleton { once.Do(func() { instance = &Singleton{ data: "initialized", } }) return instance } func (s *Singleton) SetData(data string) { s.data = data } func (s *Singleton) GetData() string { return s.data }

懒汉式单例(带缓存)

package singleton import ( "sync" "time" ) type Config struct { timeout time.Duration retries int } var ( configInstance *Config configMu sync.RWMutex ) func GetConfig() *Config { // 先检查(快速路径) configMu.RLock() if configInstance != nil { defer configMu.RUnlock() return configInstance } configMu.RUnlock() // 需要初始化,获取写锁 configMu.Lock() defer configMu.Unlock() // 双重检查 if configInstance == nil { configInstance = &Config{ timeout: 30 * time.Second, retries: 3, } } return configInstance }

三、工厂模式

工厂模式封装对象的创建过程,使客户端代码与具体实现解耦。

简单工厂

package factory type Product interface { GetName() string } type ConcreteProductA struct{} func (p *ConcreteProductA) GetName() string { return "Product A" } type ConcreteProductB struct{} func (p *ConcreteProductB) GetName() string { return "Product B" } func NewProduct(productType string) Product { switch productType { case "A": return &ConcreteProductA{} case "B": return &ConcreteProductB{} default: return nil } }

工厂方法

package factory type Factory interface { CreateProduct() Product } type ConcreteFactoryA struct{} func (f *ConcreteFactoryA) CreateProduct() Product { return &ConcreteProductA{} } type ConcreteFactoryB struct{} func (f *ConcreteFactoryB) CreateProduct() Product { return &ConcreteProductB{} } func main() { var factory Factory = &ConcreteFactoryA{} product := factory.CreateProduct() println(product.GetName()) }

抽象工厂

package factory type Button interface { Click() string } type Checkbox interface { Check() string } type GUIFactory interface { CreateButton() Button CreateCheckbox() Checkbox } type WindowsButton struct{} func (b *WindowsButton) Click() string { return "Windows button clicked" } type WindowsCheckbox struct{} func (c *WindowsCheckbox) Check() string { return "Windows checkbox checked" } type WindowsFactory struct{} func (f *WindowsFactory) CreateButton() Button { return &WindowsButton{} } func (f *WindowsFactory) CreateCheckbox() Checkbox { return &WindowsCheckbox{} }

四、建造者模式

建造者模式将复杂对象的构建过程与其表示分离,使同样的构建过程可以创建不同的表示。

package builder type Product struct { PartA string PartB string PartC string } type Builder interface { BuildPartA() BuildPartB() BuildPartC() GetProduct() *Product } type ConcreteBuilder struct { product *Product } func NewConcreteBuilder() *ConcreteBuilder { return &ConcreteBuilder{ product: &Product{}, } } func (b *ConcreteBuilder) BuildPartA() { b.product.PartA = "Part A" } func (b *ConcreteBuilder) BuildPartB() { b.product.PartB = "Part B" } func (b *ConcreteBuilder) BuildPartC() { b.product.PartC = "Part C" } func (b *ConcreteBuilder) GetProduct() *Product { return b.product } type Director struct { builder Builder } func (d *Director) Construct() *Product { d.builder.BuildPartA() d.builder.BuildPartB() d.builder.BuildPartC() return d.builder.GetProduct() }

五、原型模式

原型模式通过复制现有对象来创建新对象,避免重复的初始化过程。

package prototype import "encoding/json" type Prototype interface { Clone() Prototype } type ConcretePrototype struct { ID int Name string Items []string } func (p *ConcretePrototype) Clone() Prototype { // 深拷贝 data, _ := json.Marshal(p) clone := &ConcretePrototype{} json.Unmarshal(data, clone) return clone } func (p *ConcretePrototype) CloneShallow() Prototype { // 浅拷贝 clone := *p return &clone }

六、抽象工厂模式实战

场景:数据库连接工厂

package factory import "database/sql" type Database interface { Connect() error Query(sql string) (*sql.Rows, error) Close() error } type DatabaseFactory interface { CreateDatabase(config map[string]string) Database } type MySQLDatabase struct { conn *sql.DB } func (m *MySQLDatabase) Connect() error { // MySQL连接逻辑 return nil } func (m *MySQLDatabase) Query(sql string) (*sql.Rows, error) { // 查询逻辑 return nil, nil } func (m *MySQLDatabase) Close() error { return m.conn.Close() } type MySQLFactory struct{} func (f *MySQLFactory) CreateDatabase(config map[string]string) Database { return &MySQLDatabase{} } func NewDatabaseFactory(dbType string) DatabaseFactory { switch dbType { case "mysql": return &MySQLFactory{} case "postgres": return &PostgresFactory{} default: return nil } }

七、单例模式实战

场景:日志管理器

package logger import ( "sync" "io" "os" ) type Logger struct { writer io.Writer } var ( loggerInstance *Logger loggerOnce sync.Once ) func GetLogger() *Logger { loggerOnce.Do(func() { file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { file = os.Stdout } loggerInstance = &Logger{ writer: file, } }) return loggerInstance } func (l *Logger) Log(message string) { l.writer.Write([]byte(message + "\n")) }

八、建造者模式实战

场景:HTTP客户端配置

package client import ( "net/http" "time" ) type HTTPClient struct { client *http.Client baseURL string timeout time.Duration headers map[string]string } type HTTPClientBuilder struct { baseURL string timeout time.Duration headers map[string]string } func NewHTTPClientBuilder() *HTTPClientBuilder { return &HTTPClientBuilder{ timeout: 30 * time.Second, headers: make(map[string]string), } } func (b *HTTPClientBuilder) WithBaseURL(url string) *HTTPClientBuilder { b.baseURL = url return b } func (b *HTTPClientBuilder) WithTimeout(timeout time.Duration) *HTTPClientBuilder { b.timeout = timeout return b } func (b *HTTPClientBuilder) WithHeader(key, value string) *HTTPClientBuilder { b.headers[key] = value return b } func (b *HTTPClientBuilder) Build() *HTTPClient { client := &http.Client{ Timeout: b.timeout, } return &HTTPClient{ client: client, baseURL: b.baseURL, timeout: b.timeout, headers: b.headers, } }

九、总结

创建型设计模式帮助我们管理对象的创建过程:

  1. 单例模式:确保全局唯一实例
  2. 工厂模式:封装对象创建逻辑
  3. 抽象工厂模式:创建一系列相关对象
  4. 建造者模式:分步构建复杂对象
  5. 原型模式:通过复制创建对象

在Go语言中应用这些模式时,要注意:

  • 利用接口实现解耦
  • 考虑并发安全性
  • 避免过度设计
  • 保持代码简洁

选择合适的设计模式可以提高代码的可维护性和可扩展性。

http://www.cnnetsun.cn/news/2421257.html

相关文章:

  • 量子计算优化Benders分解:减少量子比特与提升收敛效率
  • STM32 IAP升级后APP程序中断不响应?手把手教你配置VTOR寄存器搞定
  • LaTeX中文排版一站式解决方案:告别字体配置烦恼
  • 2026年5月最新盘点:为什么选择必火AI数字人?
  • 华为AirEngine5760-10通过SFTP恢复Fit模式实战指南
  • 游戏开发工作流程
  • 别再手动对比了!在Ubuntu 22.04上5分钟搞定Beyond Compare 4安装与破解(附最新可用密钥)
  • 中望3D 2021隐藏技巧:用基准坐标系(Datum CSYS)玩转高效装配与工程图
  • 告别静态图:用PPT 3D对象实现分子结构的“沉浸式”讲解
  • C公司N产品装配线平衡优化【附代码】
  • DPDK TestPMD实战:如何用多核配置压测出万兆网卡的真实转发性能?
  • 别再只做静态展示了!用Vue+Unity WebGL给你的数字孪生模型注入实时数据灵魂(附Node.js后端源码)
  • 在ZYNQ上玩转uCOSIII网络功能:从Hello World到TCP/IP通信实战
  • 基于ZYNQ的阵列涡流检测硬件架构:从多通道采集到数字相敏检波
  • 告别命令行恐惧!用SourceTree可视化搞定Git分支、合并与冲突(附实战截图)
  • 3D打印与EL电致发光技术:打造可穿戴发光艺术品的完整指南
  • CircuitPython嵌入式开发实战:从文件系统损坏到硬件兼容性的全面故障排查指南
  • 贪心算法74-77
  • 文档下载神器kill-doc:一键拯救被平台困住的30+文档资源
  • 终极指南:如何用Python invisible-watermark为你的图片添加隐形“数字指纹“
  • ZYNQ MPSoC实战:基于FreeRTOS的多任务LED控制与硬件交互
  • 别再踩坑了!RTX 30系显卡(3050Ti/3060)从查驱动到装PyTorch的保姆级避坑指南
  • WarcraftHelper终极指南:5分钟让魔兽争霸3焕然一新
  • 告别命令行!用Python脚本批量管理Docker容器和镜像的实战技巧
  • ARM TLBIP指令解析与性能优化实践
  • 【图像处理】基于导数交替方向优化方法的全变分图像恢复附matlab代码
  • Spring Boot+Vue前后端分离项目Linux部署实战与避坑指南
  • 基于RAG的本地知识库搭建:从原理到实践,打造个人智能文件大脑
  • S32K3 FlexCAN过滤器配置全解析:从标准邮箱到Enhanced FIFO,一篇搞定报文筛选
  • NGA论坛浏览体验革命:5个实用技巧让你的摸鱼效率提升300%