Golang设计模式中抽象工厂模式详细讲解

作者:Ch3n 时间:2023-08-04 20:46:46 

抽象工厂模式

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

Golang设计模式中抽象工厂模式详细讲解

抽象工厂定义了用于创建不同产品的接口, 但将实际的创建工作留给了具体工厂类。 每个工厂类型都对应一个特定的产品变体。

在创建产品时, 客户端代码调用的是工厂对象的构建方法, 而不是直接调用构造函数 (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
  • asp之家 网络编程 m.aspxhome.com