首页 > 其他分享 >03-Go设计模式-工厂方法模式

03-Go设计模式-工厂方法模式

时间:2022-09-27 18:35:37浏览次数:54  
标签:03 return fruit 工厂 Fruit func Go 设计模式 type

工厂模式方法模式

示例代码

/*
工厂方法模式
抽象工厂(Abstract Factory)角色:工厂方法模式的核心,任何工厂类都必须实现这个接口
工厂(Concrete Factory)角色:具体工厂类是抽象工厂的一个实现,负责实例化产品对象
抽象产品(Abstract Product)角色:工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口
具体产品(Concrete Product)角色:工厂方法模式所创建的具体实例对象
简单工厂模式  + “开闭原则” =  工厂方法模式

优点:
1. 不需要记住具体类名,甚至连具体参数都不用记忆。
2. 实现了对象创建和使用的分离。
3. 系统的可扩展性也就变得非常好,无需修改接口和原类。
4.对于新产品的创建,符合开闭原则。

缺点:
1. 增加系统中类的个数,复杂度和理解度增加。
2. 增加了系统的抽象性和理解难度。


适用场景:
1. 客户端不知道它所需要的对象的类。
2. 抽象工厂类通过其子类来指定创建哪个对象。
*/

package _1_factory_method

//-------------- 抽象层 ----------------------------------------------------

//水果类(抽象接口)
type Fruit interface {
	Show() string //接口的某个方法
}

//工厂类(抽象接口)
type AbstractFactory interface {
	CreateFruit() Fruit //生产水果类(抽象)的生产器方法
}

//-------------- 基础模块类 ------------------------------------------

//Apple ...
type Apple struct {
	//其他参数
}

func (a *Apple) Show() string {
	return "我是苹果"
}

//Banana ...
type Banana struct {
	//其他参数
}

func (b *Banana) Show() string {
	return "我是香蕉"
}

//Pear ...
type Pear struct {
	//其他参数
}

func (p *Pear) Show() string {
	return "我是梨子"
}

//-------------------------- 工厂模块 ----------------------------------
//AppleFactory 具体的苹果工厂
type AppleFactory struct {
	//其他参数
}

func (fac *AppleFactory) CreateFruit() Fruit {
	var fruit Fruit

	//生产一个具体的苹果
	fruit = new(Apple)

	return fruit
}

//BananaFactory 具体的香蕉工厂
type BananaFactory struct {
	//其他参数
}

func (fac BananaFactory) CreateFruit() Fruit {
	var fruit Fruit

	//生产一个具体的香蕉
	fruit = new(Banana)

	return fruit
}

//PearFactory 具体的梨工厂
type PearFactory struct {
	//其他参数
}

func (fac *PearFactory) CreateFruit() Fruit {
	var fruit Fruit

	//生产一个具体的梨
	fruit = new(Pear)

	return fruit
}

//----------------------------------- 构造函数 ---------------------------------
func NewFruit(abs AbstractFactory) Fruit {
	return abs.CreateFruit()
}

//----------------------------------------------------------------------------------
//------------------------------------ 新增一个需求 日本苹果 ---------------------------
//-------------------------- 基础模块 ------------------------------------------------
//JapanApple ...
type JapanApple struct {
	//其他参数
}

func (j *JapanApple) Show() string {
	return "日本苹果"
}

//------------------------ 工厂模块 --------------------------------------------------
type JapanAppleFactory struct {
	//其他参数
}

func (fac *JapanAppleFactory) CreateFruit() Fruit {
	var fruit Fruit

	//生产一个日本苹果
	fruit = new(JapanApple)

	return fruit
}

测试代码

package _1_factory_method

import "testing"

func TestApple(t *testing.T) {
	//1 先要一个具体的苹果工厂
	var appleFac AbstractFactory
	appleFac = new(AppleFactory)

	//2 生产相对应的具体水果
	var apple Fruit
	apple = appleFac.CreateFruit()

	if apple.Show() != "我是苹果" {
		t.Fatal("erro")
	}
}

func TestBanana(t *testing.T) {
	//具体工厂
	var bananaFactory BananaFactory

	//生产相应水果
	if NewFruit(bananaFactory).Show() != "我是香蕉" {
		t.Fatal("error")
	}
}

标签:03,return,fruit,工厂,Fruit,func,Go,设计模式,type
From: https://www.cnblogs.com/lichengguo/p/16735518.html

相关文章

  • Qt-工程打开后,编译提示“error: member access into incomplete type 'Ui::MainWindow
    问题现象:之前程序都是可以正常运行的,编译也没有错误提示。今天打开工程后,提示“error:memberaccessintoincompletetype'Ui::MainWindow'”问题原因:原因:访问到不完整......
  • 02-Go设计模式-简单工厂
    简单工厂模式示例代码/*简单工厂模式角色和职责工厂(Factory)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象......
  • django利用中间件记录接口时长
    #-*-coding:utf-8-*-"""计算每个接口请求时长"""importtimeimportloggingfromdjango.utils.deprecationimportMiddlewareMixin​​classApiTimeMiddleWare(Midd......
  • 设计模式 -- Prototype(原型模式)
    原型模式(Prototype)使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些......
  • django rest-framework 自定义异常捕获类
    djangorest-framework自定义异常捕获类环境:django3.2python3先创建文件exceptions.py(文件名称可以自定义)1、重写exception_handler,自定义异常类#-*-coding:ut......
  • day03 --> (多表查询、事务、DCL)
    一、多表查询 1.查询语法: select列名列表from表名列表where准备SQL:#创建部门表createtabledept(idintprimarykeyauto_increment,......
  • go之new和make
    我们先来看一个例子:funcmain(){ vara*int *a=100 fmt.Println(*a) varbmap[string]int b["沙河娜扎"]=100 fmt.Println(b)}执行上面的代码会引......
  • DAY 03
    论文:2021_TIP_Spatial_Information_Guided_Convolution_for_Real-Time_RGBD_Semantic_Segmentation主要工作:生成适应空间信息的不同采样分布的卷积核,增强网络的空间适应性......
  • 使用django内置User表,继承AbstractBaseUser
    使用django内置User表,继承AbstractBaseUser本篇文章借鉴:https://blog.csdn.net/qq_29892201/article/details/108258457环境:django3.2python3使用django内置User表,......
  • js 对象null 或者 'null' 值处理(去除null值)
    转载  https://blog.csdn.net/Baby_lucy/article/details/105179360js对象null或者'null'值处理(去除null值)/***data需要传入的去除null值的对象或者值*......