设计模式-简单工厂模式(Go实现)_设计模式go简单工厂,Golang开发还不会这些

32 阅读3分钟

简单工厂模式

简单工厂模式并不属于GoF的23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下:

首先将需要创建的各种不同对象(例如各种不同的Food对象)的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象客户端只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。

需求

快餐店的食物,目前有汉堡,粥,需要向顾客展示价格。

修改前

错误设计

在这里插入图片描述

代码

package SimpleFactory

import "fmt"

type Food struct {
	price int
	type_ string
}

func NewFood(t string) \*Food {
	if t == "hamburger"{
		return &Food{
			type_: t,
			price: 13,
		}
	}else if t == "porridge"{
		return &Food{
			type_: t,
			price: 8,
		}
	}
	return nil
}

func (f Food)Display()  {
	if f.type_ == "hamburger"{
		fmt.Println("I'm Hamburger, price is ",f.price)
	}else if f.type_ == "porridge"{
		fmt.Println("I'm Porridge, price is ",f.price)
	}
}

可以看出有几个问题

  1. 这个类有很多if…else,代码冗长
  2. 职责过重,食物相关的所有东西都放在了一起
  3. 违反开闭原则,添加一款新的食物时就需要修改这个类

修改后

正确设计

在这里插入图片描述

代码实现

package SimpleFactory

import (
	"fmt"
)

type Foods interface {
	Display()
}

type Hamburger struct {
	price int
}

func (h Hamburger) Display() {
	fmt.Println("I'm Hamburger, price is ",h.price)
}

type Porridge struct {
	price int
}

func (p Porridge) Display() {
	fmt.Println("I'm Porridge, price is ",p.price)
}

type FoodsFactory struct {

}

func (f FoodsFactory)GetFood(name string) Foods {
	switch name {
	case "hamburger":
		return & Hamburger{price: 10}
	case "porridge":
		return &Porridge{price: 8}
	default:
		return nil
	}
}

相对于修改前,增加一个食品时只需要新增一个类,实现Display方法即可,不对原来的汉堡和粥的代码修改,维护工厂类的GetFood方法即可。
简化:去除工厂类,将工厂方法(GetFood)与抽象类/接口(Foods)合并

测试

测试代码

package SimpleFactory

import (
	"fmt"
	"testing"
)

func TestWrong(t \*testing.T) {
	ham := NewFood("hamburger")
	ham.Display()
	por := NewFood("porridge")
	por.Display()
	wrong := NewFood("not exist")
	fmt.Println(wrong)
}

func TestSimple(t \*testing.T) {
	f := FoodsFactory{}
	ham := f.GetFood("hamburger")
	ham.Display()
	por := f.GetFood("porridge")
	por.Display()


![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c04cae6266b74305bdd3145c99a26410~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252636&x-signature=r46hVn8%2FnN5F3HP3kduswUyqszU%3D)
![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/9b07e63776244f01b6ed94b5a730a92b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252636&x-signature=E6XEUkulImU2MrSAgqo9E3EDl1c%3D)
![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/38af40f8dfd3483d9f368d65fcde095c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252636&x-signature=X28qOYTszLH%2BCftEOY%2BIX4z3uCI%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**