Golang设计模式中抽象工厂模式详细讲解
作者:Ch3n 时间:2023-08-04 20:46:46
抽象工厂模式
抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
抽象工厂定义了用于创建不同产品的接口, 但将实际的创建工作留给了具体工厂类。 每个工厂类型都对应一个特定的产品变体。
在创建产品时, 客户端代码调用的是工厂对象的构建方法, 而不是直接调用构造函数 (new操作符)。 由于一个工厂对应一种产品变体, 因此它创建的所有产品都可相互兼容。
客户端代码仅通过其抽象接口与工厂和产品进行交互。 该接口允许同一客户端代码与不同产品进行交互。 你只需创建一个具体工厂类并将其传递给客户端代码即可。
概念示例
让我们假设一下, 如果你想要购买一组运动装备, 比如一双鞋与一件衬衫这样由两种不同产品组合而成的套装。 相信你会想去购买同一品牌的商品, 这样商品之间能够互相搭配起来。
如果我们把这样的行为转换成代码的话, 帮助我们创建此类产品组的工具就是抽象工厂, 便于产品之间能够相互匹配。
iSportsFactory.go: 抽象工厂接口
package main
import "fmt"
type ISportsFactory interface {
makeShoe() IShoe
makeShirt() IShirt
}
func GetSportsFactory(brand string) (ISportsFactory, error) {
if brand == "adidas" {
return &Adidas{}, nil
}
if brand == "nike" {
return &Nike{}, nil
}
return nil, fmt.Errorf("Wrong brand type passed")
}
adidas.go: 具体工厂
package main
type Adidas struct {
}
func (a *Adidas) makeShoe() IShoe {
return &AdidasShoe{
Shoe: Shoe{
logo: "adidas",
size: 14,
},
}
}
func (a *Adidas) makeShirt() IShirt {
return &AdidasShirt{
Shirt: Shirt{
logo: "adidas",
size: 14,
},
}
}
nike.go: 具体工厂
package main
type Nike struct {
}
func (n *Nike) makeShoe() IShoe {
return &NikeShoe{
Shoe: Shoe{
logo: "nike",
size: 14,
},
}
}
func (n *Nike) makeShirt() IShirt {
return &NikeShirt{
Shirt: Shirt{
logo: "nike",
size: 14,
},
}
}
iShoe.go: 抽象产品
package main
type IShoe interface {
setLogo(logo string)
setSize(size int)
getLogo() string
getSize() int
}
type Shoe struct {
logo string
size int
}
func (s *Shoe) setLogo(logo string) {
s.logo = logo
}
func (s *Shoe) getLogo() string {
return s.logo
}
func (s *Shoe) setSize(size int) {
s.size = size
}
func (s *Shoe) getSize() int {
return s.size
}
adidasShoe.go: 具体产品
package main
type AdidasShoe struct {
Shoe
}
nikeShoe.go: 具体产品
package main
type NikeShoe struct {
Shoe
}
iShirt.go: 抽象产品
package main
type IShirt interface {
setLogo(logo string)
setSize(size int)
getLogo() string
getSize() int
}
type Shirt struct {
logo string
size int
}
func (s *Shirt) setLogo(logo string) {
s.logo = logo
}
func (s *Shirt) getLogo() string {
return s.logo
}
func (s *Shirt) setSize(size int) {
s.size = size
}
func (s *Shirt) getSize() int {
return s.size
}
adidasShirt.go: 具体产品
package main
type AdidasShirt struct {
Shirt
}
nikeShirt.go: 具体产品
package main
type NikeShirt struct {
Shirt
}
main.go: 客户端代码
package main
import "fmt"
func main() {
adidasFactory, _ := GetSportsFactory("adidas")
nikeFactory, _ := GetSportsFactory("nike")
nikeShoe := nikeFactory.makeShoe()
nikeShirt := nikeFactory.makeShirt()
adidasShoe := adidasFactory.makeShoe()
adidasShirt := adidasFactory.makeShirt()
printShoeDetails(nikeShoe)
printShirtDetails(nikeShirt)
printShoeDetails(adidasShoe)
printShirtDetails(adidasShirt)
}
func printShoeDetails(s IShoe) {
fmt.Printf("Logo: %s", s.getLogo())
fmt.Println()
fmt.Printf("Size: %d", s.getSize())
fmt.Println()
}
func printShirtDetails(s IShirt) {
fmt.Printf("Logo: %s", s.getLogo())
fmt.Println()
fmt.Printf("Size: %d", s.getSize())
fmt.Println()
}
output.txt: 执行结果
Logo: nike
Size: 14
Logo: nike
Size: 14
Logo: adidas
Size: 14
Logo: adidas
Size: 14
来源:https://ch3nnn.blog.csdn.net/article/details/126847391
标签:Go,抽象工厂模式,设计模式
0
投稿
猜你喜欢
numpy.random模块用法总结
2023-05-11 00:48:19
十几行的超简日历组件(兼容FF)js源码
2010-08-08 08:49:00
在ASP.NET 2.0中操作数据之五十五:编辑和删除现有的二进制数据
2023-07-10 02:05:43
ORACLE分区表转换在线重定义DBMS_REDEFINITION
2024-01-16 00:23:18
基于Python实现RLE格式分割标注文件的格式转换
2022-10-22 08:41:12
海王小姐姐悄悄问我怎么在PC端登录多个微信
2021-10-27 16:25:10
python代码实现扫码关注公众号登录的实战
2021-11-18 04:40:43
ASP Google的translate API代码
2011-04-03 11:16:00
浅谈一下基于Pytorch的可视化工具
2022-12-28 23:08:07
Python实现的读写json文件功能示例
2023-11-29 21:42:41
Vue.js 时间转换代码及时间戳转时间字符串
2024-04-30 10:21:53
Python数据结构详细
2022-10-03 21:02:00
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
2021-01-30 01:16:57
源码编译安装MySQL8.0.20的详细教程
2024-01-22 11:55:52
mysql中#{}和${}的区别详解
2024-01-12 21:37:17
在win10和linux上分别安装Python虚拟环境的方法步骤
2023-09-06 18:40:01
对Python中一维向量和一维向量转置相乘的方法详解
2022-01-24 12:44:14
一篇文章带你学习Python3的高级特性(1)
2021-09-24 04:39:01
一文带你解密Python可迭代对象的排序问题
2023-11-26 00:53:13
Python异常原理及异常捕捉实现过程解析
2021-04-14 23:05:40