简单工厂模式
发布于: 2020 年 11 月 08 日
golang 设计模式
https://github.com/kaysun/go_design_pattern.git
简单工厂模式, 提供创建接口对象的工厂方法,将对象交由工厂创建,客户端只和工厂打交道,获得接口对象。
// package simple_factory 简单工厂模式package simple_factoryimport "fmt"// Fruit 水果接口type Fruit interface { // Peeling 削果皮 Peeling() // Eat 吃水果 Eat()}// Apple 苹果,实现Fruit接口type Apple struct{}// Banana 香蕉,实现Fruit接口type Banana struct{}// Orange 橘子,实现Fruit接口type Orange struct{}// Peeling 苹果削果皮func (apple Apple) Peeling() { fmt.Println("削苹果果皮")}// Eat 吃苹果func (apple Apple) Eat() { fmt.Println("吃苹果")}// Peeling 香蕉剥果皮func (banana Banana) Peeling() { fmt.Println("剥开香蕉果皮")}// Eat 吃香蕉func (banana Banana) Eat() { fmt.Println("吃香蕉")}// Peeling 橘子剥果皮func (orange Orange) Peeling() { fmt.Println("剥开橘子果皮")}// Eat 吃橘子func (orange Orange) Eat() { fmt.Println("吃橘子")}// FruitType 水果类型type FruitType uint8const ( // FruitTypeApple 苹果 FruitTypeApple FruitType = iota // FruitTypeBanana 香蕉 FruitTypeBanana // FruitTypeOrange 橙子 FruitTypeOrange)// FruitFuncMap 全局可导出变量,水果类型与创建水果对象的map,用于减小圈复杂度var FruitFuncMap = map[FruitType]func() Fruit{ FruitTypeApple: produceApple, FruitTypeBanana: produceBanana, FruitTypeOrange: produceOrange,}// ProduceFruit 生产水果的简单工厂,根据水果类型,获取创建接口对象的funcfunc ProduceFruit(fruitType FruitType) Fruit { if handler, ok := FruitFuncMap[fruitType]; ok { return handler() } return nil}// produceApple 生产苹果func produceApple() Fruit { return &Apple{}}// produceApple 生产香蕉func produceBanana() Fruit { return &Banana{}}// produceApple 生产橘子func produceOrange() Fruit { return &Orange{}}
package simple_factoryimport "testing"func Test(t *testing.T) { t.Run("simple_factory: ", ProduceFruitAndEat)}func ProduceFruitAndEat(t *testing.T) { var apple, banana, orange Fruit apple = ProduceFruit(FruitTypeApple) banana = ProduceFruit(FruitTypeBanana) orange = ProduceFruit(FruitTypeOrange) apple.Peeling() apple.Eat() banana.Peeling() banana.Eat() orange.Peeling() orange.Eat()}
输出:
削苹果果皮吃苹果剥开香蕉果皮吃香蕉剥开橘子果皮吃橘子
划线
评论
复制
发布于: 2020 年 11 月 08 日阅读数: 26
版权声明: 本文为 InfoQ 作者【猴子胖胖】的原创文章。
原文链接:【http://xie.infoq.cn/article/7a7a6db5b267b5f7ef6b5394c】。文章转载请联系作者。
猴子胖胖
关注
6年ios开发,1年golang开发 2020.05.09 加入
还未添加个人简介
评论