GO设计模式——工厂方法模式

本文介绍了工厂模式的概念,以及如何在Go语言中运用工厂方法模式实现一个积木工厂系统,通过实例展示了如何创建产品接口、具体产品和工厂接口的实现,以及如何在主函数中使用这些工厂来创建并操作积木。
摘要由CSDN通过智能技术生成

一、工厂模式概述

工厂模式是一种创建型设计模式,它定义了一个创建对象的接口,但将实际的对象创建工作推迟到子类中进行。这使得在不直接调用构造函数的情况下创建对象成为可能,从而提高了系统的灵活性和可扩展性。
说白了,就是你要去买水果,不用去果园里摘,而是直接去水果店直接拿就可以。

二、Go语言实现

1、工厂方法模式的实现步骤

  1. 定义产品接口
  2. 实现接口(具体产品)
  3. 定义产品工厂接口
  4. 实现产品工厂接口(具体产品的具体工厂)
    下面我们就用一个例子来实现这个步骤:
    步骤一: 定义产品接口
// 定义一个动物接口,有叫的行为和吃的行为
type Animal interface {
    Speak() string
    Eat() string
}

步骤二: 实现接口(具体的产品)

// 定义两个具体的动物实现这个接口
// 狗的实现
type Dog struct {
    Name string
}

func (dog Dog) Speak() string {
    return dog.Name + "发出了汪汪的叫声"
}
func (dog Dog) Eat() string {
    return dog.Name + "正在吃狗粮"
}

// 猫的实现
type Cat struct {
    Name string
}

func (cat Cat) Speak() string {
    return cat.Name + "发出了喵喵的叫声"
}
func (cat Cat) Eat() string {
    return cat.Name + "正在吃猫粮"
}

步骤三: 定义产品工厂接口

// 获取动物的工厂接口
type AnimalFactory interface {
    CreateAnimal() Animal
}

步骤四: 实现产品工厂接口(具体产品的具体工厂)

// 对每一类动物定义工厂实现类
type DogFactory struct{}
type CatFactory struct{}

func (df DogFactory) CreateAnimal() Animal {
    return Dog{Name: "来福"}
}
func (cf CatFactory) CreateAnimal() Animal {
    return Cat{Name: "花花"}
}

然后在main函数中使用:

func main() {
    dogFactory := DogFactory{}
    catFactory := CatFactory{}
    dog := dogFactory.CreateAnimal()
    cat := catFactory.CreateAnimal()
    fmt.Println(dog.Speak())
    fmt.Println(dog.Eat())
    fmt.Println(cat.Speak())
    fmt.Println(cat.Eat())

}

三、练手题目

这里我使用的题目都来自于代码随想录的卡码网,大家也可以自己去上面练习。

1、题目简介

【设计模式专题之工厂方法模式】2.积木工厂

时间限制:1.000S  空间限制:256MB

题目描述

小明家有两个工厂,一个用于生产圆形积木,一个用于生产方形积木,请你帮他设计一个积木工厂系统,记录积木生产的信息。

输入描述

输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示生产的次数。

接下来的 N 行,每行输入一个字符串和一个整数,字符串表示积木的类型。积木类型分为 “Circle” 和 “Square” 两种。整数表示该积木生产的数量

输出描述

对于每个积木,输出一行字符串表示该积木的信息。

输入示例
3
Circle 1
Square 2
Circle 1
输出示例
Circle Block
Square Block
Square Block
Circle Block
提示信息

在示例中,积木工厂生产了3块积木,其中有2块是圆形积木,1块是方形积木。根据输入的类型,每块积木的信息被输出到控制台。

2、具体实现

package main

import (
    "fmt"
)

// 定义一个积木接口
type Block interface {
    //具有生产的行为
    Produce() string
}
//圆形积木实现
type Circle struct{}

func (c Circle) Produce() string {
    return "Circle Block"
}
//方形积木实现
type Square struct{}

func (s Square) Produce() string {
    return "Square Block"
}
//积木工厂接口
type BlockFactory interface {
    CreateBlock() Block
}

type CircleFactory struct{}
type SquareFactory struct{}
//圆形积木工厂实现
func (c *CircleFactory) CreateBlock() Block {
    return &Circle{}
}
//方形积木工厂实现
func (s *SquareFactory) CreateBlock() Block {
    return &Square{}
}

func main() {
    circleFactory := CircleFactory{}
    squareFactory := SquareFactory{}
    arr := []string{}
    var count int
    fmt.Scanln(&count)

    for count > 0 {
       var text string
       var numb int
       fmt.Scanf("%s %d\n", &text, &numb)

       if text == "done" {
          break
       }
       switch text {
       case "Circle":
          for i := 0; i < numb; i++ {
             res := circleFactory.CreateBlock().Produce()
             arr = append(arr, res)
          }
          break
       case "Square":
          for i := 0; i < numb; i++ {
             res := squareFactory.CreateBlock().Produce()
             arr = append(arr, res)
          }
          break
       default:
          break

       }
       count--
    }
    for _, item := range arr {
       fmt.Println(item)
    }
}
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值