GO设计模式——2、工厂方法模式(创建型)

目录

工厂方法模式(Factory Method Pattern)

工厂模式的核心角色

优缺点

代码实现


工厂方法模式(Factory Method Pattern)

        工厂方法模式(Factory Method Pattern)又叫作多态性工厂模式,指的是定义一个创建对象的接口,但由实现这个接口的工厂类来决定实例化哪个产品类,工厂方法把类的实例化推迟到子类中进行。在工厂方法模式中,不再由单一的工厂类生产产品,而是由工厂类的子类实现具体产品的创建。因此,当增加一个产品时,只需增加一个相应的工厂类的子类, 以解决简单工厂生产太多产品时导致其内部代码臃肿(switch … case分支过多)的问题。(注意:Go中没有继承,所以这里说的工厂子类,其实是直接实现工厂接口的具体工厂类。)

        工厂方法模式在Go语言中有着广泛的应用,例如在数据库访问消息队列日志记录等方面都可以使用工厂方法模式来创建对象实例,以实现更加灵活和可扩展的代码。

工厂模式的核心角色

        1、抽象产品(Abstract Product):定义了产品的共同接口或抽象类。它可以是具体产品类的父类或接口,规定了产品对象的共同方法。

        2、具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。

        3、抽象工厂(Abstract Factory):声明了创建产品的抽象方法,可以是接口或抽象类。它可以有多个方法用于创建不同类型的产品。

        4、具体工厂(Concrete Factory):实现了抽象工厂接口,负责实际创建具体产品的对象。

优缺点

(1)优点:

  • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
  • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

(2)缺点:

  • 类的个数容易过多,增加复杂度。
  • 增加了系统的抽象性和理解难度。
  • 只能生产一种产品,此弊端可使用抽象工厂模式解决。

代码实现

package mainimport "fmt"// (抽象产品)MathOperator 实际产品实现的接口--表示数学运算器应该有哪些行为
type MathOperator interface {SetOperandA(int)SetOperandB(int)ComputerResult() int
}// (具体产品)PlusOperator 实际的产品类--加法运算器
type PlusOperator struct {operandA intoperandB int
}func (po *PlusOperator) SetOperandA(operand int) {po.operandA = operand
}
func (po *PlusOperator) SetOperandB(operand int) {po.operandB = operand
}
func (po *PlusOperator) ComputerResult() int {return po.operandA + po.operandB
}// (具体产品)MultiOperator 实际的产品类--乘法运算器
type MultiOperator struct {operandA intoperandB int
}
func (mo *MultiOperator) SetOperandA(operand int) {mo.operandA = operand
}
func (mo *MultiOperator) SetOperandB(operand int) {mo.operandB = operand
}
func (mo *MultiOperator) ComputerResult() int {return mo.operandA * mo.operandB
}// (抽象工厂)OperatorFactory 工厂接口,由具体工厂类来实现
type OperatorFactory interface {Create() MathOperator
}// 假定程序可以生产两类计算器,加法计算器和乘法计算器,也就是在工厂方法模式中,存在两个子类工厂。
// (具体工厂)PlusOperatorFactory 是 PlusOperator 加法运算器的工厂类
type PlusOperatorFactory struct {
}func (pof *PlusOperatorFactory) Create() MathOperator {return &PlusOperator{operandA: 1,operandB: 2,}
}// (具体工厂)MultiOperatorFactory 是乘法运算器产品的工厂
type MultiOperatorFactory struct {
}func (mof *MultiOperatorFactory) Create() MathOperator {return &MultiOperator{operandA: 1,operandB: 2,}
}func main() {// 使用工厂方法模式时,客户端代码只需要调用工厂接口的方法,而无需关心具体的产品对象是如何创建的。factory := &PlusOperatorFactory{}plus := factory.Create()plus.SetOperandA(2)plus.SetOperandB(3)fmt.Printf("%v\n", plus.ComputerResult())factorym := &MultiOperatorFactory{}multi := factorym.Create()multi.SetOperandA(1)multi.SetOperandB(3)fmt.Printf("%v\n", multi.ComputerResult())
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/204061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kali Linux 2023.4 已经发布了!

开发人员推出了 Kali Linux 2023.4,这是2023 年发行版的第四个也是最后一个版本。 新产品已经可供下载,包含15 个新工具和 GNOME 45。 Offective Security 团队报告称,在今年的最终版本中,操作系统中并没有添加太多新功能&…

什么是海牙公约?

一、什么是海牙公约? "海牙公约" 通常是指1899年和1907年两次在海牙举行的国际和平会议所达成的一系列国际公约。这两次会议的目标是通过国际合作来促进和平、防止战争,并制定一些规则和原则,以限制武装冲突的影响。以下是其中两个…

用 C 写一个卷积神经网络

用 C 写一个卷积神经网络 深度学习领域最近发展很快,前一段时间读transformer论文《Attention Is All You Need》时,被一些神经网络和深度学习的概念搞得云里雾里,其实也根本没读懂。发现深度学习和传统的软件开发工程领域的差别挺大&#xf…

Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍

一、前言 单页面应用(SPA)的核心思想之一,就是更新视图而不重新请求页面,简单来说,它在加载页面时,不会加载整个页面,只会更新某个指定的容器中的内容。对于大多数单页面应用,都推荐使用官方支持的vue-rou…

动态代理配置方法。如何使用代理IP保护隐私安全?

随着网络技术的不断发展,越来越多的人开始使用代理IP来保护自己的隐私安全。代理IP是一种通过代理服务器来访问网络的特殊技术,可以隐藏用户的真实IP地址,从而保护用户的隐私。本文将介绍动态代理的配置方法以及如何使用代理IP保护隐私安全。…

PyTorch 基础篇(1):Pytorch 基础

Pytorch 学习开始 入门的材料来自两个地方: 第一个是官网教程:WELCOME TO PYTORCH TUTORIALS,特别是官网的六十分钟入门教程 DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ。 第二个是韩国大神 Yunjey Choi 的 Repo:pytorch-t…

Transformer中的layer norm(包含代码解释)

在transformer中存在add&norm操作,add操作很简单,就是把注意力矩阵和原来的矩阵相加,也就是残差链接,可以有效减少梯度消失。如下图所示,为layer norm的解释图,可以看出layer norm是针对一个token来做的…

接口自动化测试总结,接口鉴权+加密与解密+数据库操作/断言...

前言 1、接口鉴权的多种方式 1)后端接口鉴权常用方法 cookie: 携带身份信息请求认证 之后的每次请求都携带cookie信息,cookie记录在请求头中 token: 携带身份信息请求认证 之后的每次请求都携带token认证信息 可能记录在请求头…

Java随记

Java java保留两位小数 1、使用String.format()方法: public static void stringFormatdecimalFormatKeepTwoDecimalPlaces(){double number 3.1415926;String result String.format("%.2f", number);System.out.println(result);}输出:3…

Large Language Models areVisual Reasoning Coordinators

目录 一、论文速读 1.1 摘要 1.2 论文概要总结 二、论文精度 2.1 论文试图解决什么问题? 2.2 论文中提到的解决方案之关键是什么? 2.3 用于定量评估的数据集是什么?代码有没有开源? 2.4 这篇论文到底有什么贡献&#xff1…

第十五章 : Spring Boot 集成MyBatis 多种方式

第十五章 : Spring Boot 集成MyBatis 方式 前言 本章知识重点:Spring Boot集成MyBatis的两种方式:注解方式和配置文件集成方式,重点推荐一款脚手架工具-mybatis-plus3以及如何在Idea中集成与应用;大大提高了开发效率,代码更加规范和简洁。 Spring Boot数据访问概述 在…

振弦采集仪助力岩土工程质量控制

振弦采集仪助力岩土工程质量控制 随着工程建设规模越来越大,建筑结构的安全性和稳定性越来越成为人们所关注的焦点。岩土工程在工程建设中占据着非常重要的地位,岩土工程质量控制更是至关重要。而振弦采集仪作为一种先进的检测设备,正得到越…

[PyTorch][chapter 5][李宏毅深度学习][Classification]

前言: 这章节主要讲解常用的分类器原理.分类主要是要找到一个映射函数 比如垃圾邮件分类 : c0, 垃圾邮件 c1 正常邮件 主要应用场景: 垃圾邮件分类,手写数字识别,金融信用评估. 这里面简单了解一下,很少用 目录: 1: …

还记得当初自己为什么选择计算机?

还记得当初自己为什么选择计算机? 当初你问我为什么选择计算机,我笑着回答:“因为我梦想成为神奇的码农!我想像编织魔法一样编写程序,创造出炫酷的虚拟世界!”谁知道,我刚入门的那天&#xff0…

离线数仓构建案例一

数据采集 日志数据(文件)到Kafka 自己写个程序模拟一些用户的行为数据,这些数据存在一个文件夹中。 接着使用flume监控采集这些文件,然后发送给kafka中待消费。 1、flume采集配置文件 监控文件将数据发给kafka的flume配置文件…

STM32——定时器Timer

定时器工作原理 软件定时 缺点:不精确、占用 CPU 资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); } 使用精准的时基,通过硬件的方式,实现定时功…

Linux---访问NFS存储及自动挂载

本章主要介绍NFS客户端的使用 创建NFS服务器并通过NFS共享一个目录在客户端上访问NFS共享的目录自动挂载的配置和使用 访问NFS存储 前面介绍了本地存储,本章就来介绍如何使用网络上的存储设备。NFS即网络文件系统, 所实现的是 Linux 和 Linux 之间的共…

TypeScript中泛型函数

一.概览 此前,对泛型有了整体的概览,详见TypeScript中的泛型,后面的系列会详细地介绍TypeScript的泛型。此篇文章主要介绍泛型函数 二. 泛型函数 泛型是类型不明确的数据类型,在定义时,接收泛指的数据类型&#xff…

易点易动:颠覆固定资产用量管理,实现高效精准的企业固定资产管理

固定资产用量管理是企业日常运营中不可或缺的一环。然而,传统的人工管理方式面临着时间成本高、数据不准确、难以监控等问题。为了解决这些挑战,易点易动应运而生,它是一款先进的资产管理系统,能够帮助企业实现高效精准的固定资产…

【Java项目管理工具】Maven

Maven 文章目录 Maven一、简介二、安装和配置三、GAVP四、IDEA Maven Java Web工程五、插件、命令、生命周期六、依赖配置七、构建配置八、依赖传递与依赖冲突九、Maven工程继承和聚合关系9.1 工程继承关系9.2 工程聚合关系 十、Maven私服10.1 Nexus下载安装10.2 Nexus上的各种…