首页 > 其他分享 >go设计模式之工厂模式

go设计模式之工厂模式

时间:2023-12-06 09:00:11浏览次数:27  
标签:创建 模式 工厂 具体 go 设计模式 方法

Go语言实现设计模式之工厂方法模式

原创 汀风 汀风说后端 2023-12-06 08:10 发表于北京 汀风说后端 编程知识普及,让学习与工作变得更简单。 18篇原创内容 公众号

摘要:

工厂方法模式是一种创建型设计模式,它将对象的创建延迟到子类中进行,通过定义一个创建对象的接口,让子类决定实例化哪个类。本文将详细介绍Go语言中如何实现工厂方法模式,并结合开发和生活中的示例,说明该设计模式的应用场景。

1.工厂方法模式概述
工厂方法模式属于创建型设计模式,它提供了一种将对象的创建延迟到子类中进行的方式。工厂方法模式包含四个主要角色:抽象产品类(Product)、具体产品类(ConcreteProduct)、抽象工厂类(Factory)和具体工厂类(ConcreteFactory)。抽象产品类定义了产品的接口,具体产品类实现了具体的产品逻辑,抽象工厂类定义了创建产品的接口,具体工厂类实现了具体的产品创建逻辑。

2.Go语言实现工厂方法模式
下面我们通过一个示例来演示如何在Go语言中实现工厂方法模式。假设我们要创建一个音乐播放器,支持播放MP3和WAV两种格式的音乐。

首先,我们定义一个抽象产品类 MusicPlayer,包含一个播放方法 Play()

type MusicPlayer interface {
    Play()
}

然后,我们创建两个具体产品类 MP3Player 和 WAVPlayer,它们都实现了 MusicPlayer 接口:

type MP3Player struct{}

func (mp3 *MP3Player) Play() {
    fmt.Println("播放MP3音乐")
}

type WAVPlayer struct{}

func (wav *WAVPlayer) Play() {
    fmt.Println("播放WAV音乐")
}

接下来,我们定义一个抽象工厂类 MusicPlayerFactory,包含一个创建产品的抽象方法 CreatePlayer()

type MusicPlayerFactory interface {
    CreatePlayer() MusicPlayer
}

然后,我们创建两个具体工厂类 MP3PlayerFactory 和 WAVPlayerFactory,它们分别实现了 MusicPlayerFactory 接口:

type MP3PlayerFactory struct{}

func (mp3Factory *MP3PlayerFactory) CreatePlayer() MusicPlayer {
    return &MP3Player{}
}

type WAVPlayerFactory struct{}

func (wavFactory *WAVPlayerFactory) CreatePlayer() MusicPlayer {
    return &WAVPlayer{}
}

最后,我们在客户端代码中使用具体工厂类来创建具体的产品对象:

func main() {
    mp3Factory := &MP3PlayerFactory{}
    mp3Player := mp3Factory.CreatePlayer()
    mp3Player.Play()

    wavFactory := &WAVPlayerFactory{}
    wavPlayer := wavFactory.CreatePlayer()
    wavPlayer.Play()
}

3.代码输出结果
运行上述代码,我们将得到以下输出结果:

播放MP3音乐
播放WAV音乐

4.示例解释
通过上述示例,我们可以看到工厂方法模式的应用。在抽象工厂类中,定义了创建产品的抽象方法,具体工厂类根据需要实现该方法来创建具体的产品对象。客户端只需要使用具体工厂类来创建产品对象,无需关心具体的产品创建细节。在这个音乐播放器中,通过具体工厂类来创建不同格式的音乐播放器,客户端只需要调用播放方法即可播放音乐。

5.应用场景
工厂方法模式适用于以下场景:

  • 当需要创建的对象较多且对象之间的创建逻辑复杂时,可以使用工厂方法模式。

  • 当客户端需要根据不同的条件来创建不同类型的对象时,可以使用工厂方法模式。

  • 当需要在不同的地方使用相同的对象时,可以使用工厂方法模式。

在生活中,工厂方法模式的应用也很常见。例如,汽车制造厂根据客户的需求(抽象工厂类)生产不同类型的汽车(具体产品类),客户只需要选择合适的汽车型号(具体工厂类)就可以购买到对应的汽车。

结论:

工厂方法模式是一种常用的创建型设计模式,它将对象的创建延迟到子类中进行,通过定义一个创建对象的接口,让子类决定实例化哪个类。在Go语言中,可以通过定义抽象产品类、具体产品类、抽象工厂类和具体工厂类来实现工厂方法模式。该模式在开发中和生活中都有广泛的应用场景,能够提高代码的可维护性和可扩展性。

 

图片

欢迎加入「技术交流群」,一起学习和进步。

关注微信公众号,回复「资料」,获取:技术干货、PDF电子书、学习视频、面试资料、程序源码、各种开发软件。

点「」和「在看」是最大的支持

标签:创建,模式,工厂,具体,go,设计模式,方法
From: https://www.cnblogs.com/cheyunhua/p/17878754.html

相关文章

  • DjangoORM语法
    ORM语法-配置django中与数据库映射的关系,不需要写原始sql语句,而是定义模型类,操作模型完成对数据库进行增删改查等操作。o指类对象的意思r指数据库表的意思m指映射的意思orm的优点数据库模型定义在一个地方,方便维护orm有现成的工具,很多功能自动完成,比如数据库消除,预处......
  • FX2023全新版-Go开发工程师-从基础到项目实战再到重构zxit666+尾缀
    FX2023全新版-Go开发工程师-从基础到项目实战再到重构zxit666+尾缀Go是一种高效、牢靠和简约的编程言语,它是由Google开发的。下面是运用Go言语编写的示例代码,用于完成一个简单的Web效劳器:这段代码创立了一个简单的Web效劳器,它将返回"Hello,World!"到一切恳求的客户端。首先,我们导......
  • C1. Good Subarrays (Easy Version)
    思路:我们枚举每一个左端点,对于每一个左端点,寻找最长的满足条件的区间,这个区间长度就是左端点对答案的贡献,可以发现具有单调性,右端点只会前进不会倒退。所以我们两个指针各扫一遍区间就可以。#include<bits/stdc++.h>#definelsp<<1#definersp<<1|1#definePIIpair<int,......
  • django02
    django小白必会三板斧#启动django项目之后如何添加更多的功能回想自己编写的web框架如果要添加功能就去urls.py和views.py#django自带重启功能当识别到项目中代码有变化之后隔段时间会自动重启但是有时候较慢#与浏览器打交道的视图函数都应该有返回值常见......
  • Go - two bcrypt hashes of the same password are NOT equal
     packagemainimport("fmt""golang.org/x/crypto/bcrypt")funcmain(){password:="abcdef"hashedPassword1,_:=bcrypt.GenerateFromPassword([]byte(password),bcrypt.DefaultCost)fmt.Println(strin......
  • 23种设计模式——抽象工厂模式
    今天我们来学习一下第三种设计模式——抽象工厂模式,概念:所谓抽象工厂模式就是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。它允许客户端使用抽象的接口来创建一组相关的产品,而不需要关心实际产出的具体产品是什么。这样一来,客户就可以从具体的产品中被......
  • Django中ForeignKey函数详解
    在Django中,ForeignKey是一个数据库模型字段,用于创建多对一(many-to-one)的关系。它实质上是数据库表之间的一个链接,指向另一个模型的实例。在Django的ORM(对象关系映射)系统中,ForeignKey字段非常重要,因为它允许模型间的数据关联和交互。基本用法在Django模型中定义ForeignKey......
  • Misc_XCTF_WriteUp | base64stego
    题目提示:菜狗经过几天的学习,终于发现了如来十三掌最后一步的精髓题目:分析尝试打开压缩包,发现需要密码。但准备爆破的时候被提示zip未被加密:猜测是zip伪加密,打开十六进制文件,发现数据区的全局方式位标记第2/4个数是偶数0,而目录区的第2/4是奇数9:将9改为偶......
  • 解决vue-django配置问题
    后端跨域问题django安装pipinstalldjango-cors-headers添加应用,主应用下的settingINSTALLED_APPS=[...#跨域'corsheaders',...]中间件设置MIDDLEWARE=[...#跨域中间键设置'corsheaders.middleware.CorsMiddleware', ...]添加黑白名单(se......
  • dhango要迁移时mysql安装及配置
    一、apt安装MySQLsudoapt-getupdate#更新源sudoapt-getinstallmysql-server#安装sudoaptinstallnet-tools二、MySQL服务管理sudoservicemysqlstatus#查看服务状态sudoservicemysqlstart#启动服务sudoservicemysqlstop#停止服务sudoservice......