全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang实现工厂模式产品扩展_使用Factory Method生成新产品

工厂方法模式在Golang中通过接口定义产品(PaymentProcessor)和工厂(PaymentFactory),各具体产品(WechatPay等)实现产品接口,各具体工厂(WechatFactory等)实现工厂接口,使用方仅依赖接口,新增产品只需添加新结构体和工厂,无需修改原有代码,符合开闭原则。

用 Golang 实现工厂方法模式(Factory Method),核心是把“创建对象”的逻辑从具体业务中抽离,交给子类(或具体工厂)决定。它不直接 new 产品,而是通过一个统一接口返回产品实例,让新增产品时只需增加新工厂和新产品,无需修改原有代码 —— 符合开闭原则。

定义产品接口(Product Interface)

所有产品需实现同一接口,确保调用方能统一处理:

type PaymentProcessor interface {
    Process(amount float64) string
}

这是抽象层,后续的微信、支付宝、银行卡等支付方式都实现它。

实现具体产品(Concrete Products)

每个具体产品独立实现接口,互不影响:

  • WechatPay:实现微信支付逻辑
  • Alipay:实现支付宝支付逻辑
  • BankTransfer:实现银行转账逻辑

例如:

type WechatPay struct{}

func (w WechatPay) Process(amount float64) string {
    return "WeChat Pay processed ¥" + fmt.Sprintf("%.2f", amount)
}

声明工厂接口(Creator Interface)

定义创建产品的抽象方法,由具体工厂实现:

type PaymentFactory interface {
    CreateProcessor() PaymentProcessor
}

注意:这里不传参、不判断类型,只专注“生成一个”,把决策权交给具体工厂。

实现具体工厂(Concrete Creators)

每种产品对应一个工厂,各自负责构造自己的实例:

  • WechatFactory → 返回 WechatPay{}
  • AlipayFactory → 返回 Alipay{}
  • BankFactory → 返回 BankTransfer{}

示例:

type WechatFactory struct{}

func (w WechatFactory) CreateProcessor() PaymentProcessor {
    return WechatPay{}
}

使用时只需依赖接口,轻松扩展

业务代码完全不知道具体类型,只和接口打交道:

func Pay(factory PaymentFactory, amount float64) string {
    processor := factory.CreateProcessor()
    return processor.Process(amount)
}

// 新增支付方式?只需加新结构体 + 新工厂,调用侧一行都不用改
fmt.Println(Pay(WechatFactory{}, 100.5))   // WeChat Pay processed ¥100.50
fmt.Println(Pay(AlipayFactory{}, 200.0))    // Alipay processed ¥200.00

要加 Apple Pay?写 ApplePayApplePayFactory 即可,原 Pay() 函数照常运行。

基本上就这些。Golang 没有继承语法,但靠接口组合+结构体嵌入,一样能清晰表达工厂方法的意图 —— 解耦创建与使用,让扩展变得轻量自然。


# go  # golang  # 支付宝  # 微信  # app  # 微信支付  # apple  # 子类  # 结构体  # 继承  # 接口  # Interface  # 对象  # 只需  # 支付方式  # 各具  # 自己的  # 这是  # 开闭  # 它不  # 不传 


相关文章: b2c电商网站制作流程,b2c水平综合的电商平台?  建站之星安装模板失败:服务器环境不兼容?  建站之星24小时客服电话如何获取?  如何快速搭建高效可靠的建站解决方案?  宝塔新建站点报错如何解决?  完全自定义免费建站平台:主题模板在线生成一站式服务  javascript基本数据类型及类型检测常用方法小结  建站之星如何实现网站加密操作?  nginx修改上传文件大小限制的方法  相册网站制作软件,图片上的网址怎么复制?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何在IIS中新建站点并配置端口与物理路径?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  再谈Python中的字符串与字符编码(推荐)  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  定制建站流程解析:需求评估与SEO优化功能开发指南  佛山企业网站制作公司有哪些,沟通100网上服务官网?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  常州自助建站工具推荐:低成本搭建与模板选择技巧  家庭服务器如何搭建个人网站?  北京网站制作的公司有哪些,北京白云观官方网站?  网站按钮制作软件,如何实现网页中按钮的自动点击?  北京制作网站的公司,北京铁路集团官方网站?  北京网站制作公司哪家好一点,北京租房网站有哪些?  广东企业建站网站优化与SEO营销核心策略指南  在线制作视频网站免费,都有哪些好的动漫网站?  建站之星如何修改网站生成路径?  建站之星安装后界面空白如何解决?  如何快速搭建二级域名独立网站?  如何快速搭建虚拟主机网站?新手必看指南  深入理解Android中的xmlns:tools属性  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  油猴 教程,油猴搜脚本为什么会网页无法显示?  建站三合一如何选?哪家性价比更高?  开源网站制作软件,开源网站什么意思?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  如何彻底删除建站之星生成的Banner?  如何在云主机上快速搭建网站?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  高端建站如何打造兼具美学与转化的品牌官网?  建站VPS选购需注意哪些关键参数?  建站之星后台密码遗忘?如何快速找回?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  广州商城建站系统开发成本与周期如何控制?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。