Go和Java实现简单工厂模式

Go和Java实现简单工厂模式

本文通过计算器案例来说明简单工厂模式的使用,使用Go语言和Java语言实现。

1、简单工厂模式

简单工厂模式对对象创建管理方式最为简单,只需要创建一个简单的工厂类然后在里面创建对象,该模式通过向工

厂传递类型来指定要创建的对象。

由于 Go 本身是没有构造函数的,一般而言我们采用 NewName 的方式创建对象/接口,当它返回的是接口的时

候,其实就是简单工厂模式。

2、Go实现简单计算器

下面实现一个简单的计算器,包含简单的加减乘除功能。

package factory// 这里实现一个简单的计算器
// 计算接口,包含计算数的设置和结果的计算
type Operation interface {// 设置进行计算的两个数SetNumberA(float64)SetNumberB(float64)// 计算Calculate() (float64, error)
}
package factory// ============加法===========
type AddOperation struct {// 包含两个操作数numberA float64numberB float64
}func (addOperation *AddOperation) Calculate() (float64, error) {return addOperation.numberA + addOperation.numberB, nil
}func (addOperation *AddOperation) SetNumberA(numberA float64) {addOperation.numberA = numberA
}func (addOperation *AddOperation) SetNumberB(numberB float64) {addOperation.numberB = numberB
}
package factory// ============减法============
type SubOperation struct {// 包含两个操作数numberA float64numberB float64
}func (subOperation *SubOperation) Calculate() (float64, error) {return subOperation.numberA - subOperation.numberB, nil
}func (subOperation *SubOperation) SetNumberA(numberA float64) {subOperation.numberA = numberA
}func (subOperation *SubOperation) SetNumberB(numberB float64) {subOperation.numberB = numberB
}
package factory// ============乘法============
type MulOperation struct {// 包含两个操作数numberA float64numberB float64
}func (mulOperation *MulOperation) Calculate() (float64, error) {return mulOperation.numberA * mulOperation.numberB, nil
}func (mulOperation *MulOperation) SetNumberA(numberA float64) {mulOperation.numberA = numberA
}func (mulOperation *MulOperation) SetNumberB(numberB float64) {mulOperation.numberB = numberB
}
package factoryimport "errors"// ============除法============
type DivOperation struct {// 包含两个操作数numberA float64numberB float64
}func (divOperation *DivOperation) Calculate() (float64, error) {if divOperation.numberB == 0 {return -1, errors.New("被除数不能为0")} else {return divOperation.numberA / divOperation.numberB, nil}
}func (divOperation *DivOperation) SetNumberA(numberA float64) {divOperation.numberA = numberA
}func (divOperation *DivOperation) SetNumberB(numberB float64) {divOperation.numberB = numberB
}
package constantconst (Add = "+"Sub = "-"Mul = "*"Div = "/"
)
package factoryimport "proj/constant"// ============工厂类============
type OperationFactory struct {
}func (operationFactory *OperationFactory) CreateOperate(operate string) Operation {switch operate {case constant.Add:return &AddOperation{}case constant.Sub:return &SubOperation{}case constant.Mul:return &MulOperation{}case constant.Div:return &DivOperation{}}return nil
}
package mainimport "fmt"
import . "proj/factory"
import "proj/constant"// 测试
func main() {// 全局变量var numberA float64 = 200var numberB float64 = 100var operation Operationvar result float64var err error// ============创建工厂============operationFactory := OperationFactory{}// ============加法============operation = operationFactory.CreateOperate(constant.Add)operation.SetNumberA(numberA)operation.SetNumberB(numberB)result, err = operation.Calculate()if err != nil {fmt.Println(err)} else {fmt.Println("Add Result:", result)}// ============减法============operation = operationFactory.CreateOperate(constant.Sub)operation.SetNumberA(numberA)operation.SetNumberB(numberB)result, err = operation.Calculate()if err != nil {fmt.Println(err)} else {fmt.Println("Sub Result:", result)}// ============乘法============operation = operationFactory.CreateOperate(constant.Mul)operation.SetNumberA(numberA)operation.SetNumberB(numberB)result, err = operation.Calculate()if err != nil {fmt.Println(err)} else {fmt.Println("Mul Result:", result)}// ============除法============operation = operationFactory.CreateOperate(constant.Div)operation.SetNumberA(numberA)operation.SetNumberB(numberB)result, err = operation.Calculate()if err != nil {fmt.Println(err)} else {fmt.Println("Div Result:", result)}
}
# 程序输出
Add Result: 300
Sub Result: 100
Mul Result: 20000
Div Result: 2

3、Java实现简单计算器

package com.factory;// 这里实现一个简单的计算器
// 计算接口,包含计算数的设置和结果的计算
public abstract class Operation {private double numberA;private double numberB;// 设置进行计算的两个数public double getNumberA() {return numberA;}public void setNumberA(double numberA) {this.numberA = numberA;}public double getNumberB() {return numberB;}public void setNumberB(double numberB) {this.numberB = numberB;}// 计算public abstract double Calculate();
}
package com.factory;// ============加法===========
public class AddOperation extends Operation {@Overridepublic double Calculate() {return this.getNumberA() + this.getNumberB();}
}
package com.factory;// ============减法============
public class SubOperation extends Operation {@Overridepublic double Calculate() {return this.getNumberA() - this.getNumberB();}
}
package com.factory;// ============乘法============
public class MulOperation extends Operation {@Overridepublic double Calculate() {return this.getNumberA() * this.getNumberB();}
}
package com.factory;// ============除法============
public class DivOperation extends Operation {@Overridepublic double Calculate() {if (this.getNumberB() == 0) {throw new RuntimeException("被除数不能为0!");} else {return this.getNumberA() / this.getNumberB();}}
}
package com.factory;public enum OperationType {ADD, SUB, MUL, DIV;
}
package com.factory;// ============工厂类============
public class OperationFactory {public Operation CreateOperate(OperationType operate) {switch (operate) {case ADD:return new AddOperation();case SUB:return new SubOperation();case MUL:return new MulOperation();case DIV:return new DivOperation();}return null;}
}
package com.factory;public class Test {public static void main(String[] args) {// 全局变量Operation operation = null;double result = 0;// ============创建工厂============OperationFactory operationFactory = new OperationFactory();// ============加法============operation = operationFactory.CreateOperate(OperationType.ADD);operation.setNumberA(200);operation.setNumberB(100);result = operation.Calculate();System.out.println("result :" + result);// ============减法============operation = operationFactory.CreateOperate(OperationType.SUB);operation.setNumberA(200);operation.setNumberB(100);result = operation.Calculate();System.out.println("result :" + result);// ============乘法============operation = operationFactory.CreateOperate(OperationType.MUL);operation.setNumberA(200);operation.setNumberB(100);result = operation.Calculate();System.out.println("result :" + result);// ============除法============operation = operationFactory.CreateOperate(OperationType.DIV);operation.setNumberA(200);operation.setNumberB(100);result = operation.Calculate();System.out.println("result :" + result);}
}
# 程序输出
result :300.0
result :100.0
result :20000.0
result :2.0

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

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

相关文章

自媒体人福音,正版实用的视频素材网站~

大家平时在创作视频的时候,有没有苦恼过找不到合适的素材呢?网上能找到的大部分素材都是有版权的,不能随便乱用。今天我就来给大家推荐一些用于视频创作的正版素材网站,快快收藏吧! 1.制片帮素材 链接:stock.zhipianb…

【洛谷】分糖果

分糖果 题目链接 题意 输出你最多能获得多少作为你搬糖果的奖励的糖果数量 思路 我们知道如果糖果总数除以小朋友的数量取商为一的话,那么每个小朋友只能得到一颗糖,那么它的余数就是剩下的糖果,也就是你能获得的奖励。弄清楚n,…

Python实现广义最小二乘法线性回归模型(GLS算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 广义最小二乘法(Generalized Least Squares)是一种回归分析方法,适…

你知道海外云手机可以用于外贸测评吗?

目前随着外贸行业的发展,像亚马逊、速卖通、eBay等海外电商平台越来越火热。在这些平台,过硬的产品质量、优秀的服务、合适的价格,再加上适量的跨境电商测评,很容易就能吸引不少的客户。那么如何利用海外云手机进行外贸测评&#…

Python爬取电影天堂

前言: 本文非常浅显易懂,可以说是零基础也可快速掌握。如有疑问,欢迎留言,笔者会第一时间回复。 一、爬虫的重要性: 如果把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛通过网页的…

C语言中的#pragma预处理指令

C语言中的#pragma预处理指令 C语言中的#pragma预处理指令 C语言中的#pragma预处理指令一. pragma预处理指令概念二. pragma预处理指令的作用三. 预处理指令的参数1)message参数2)code_seg参数3)once参数4)pack参数5) s…

司铭宇老师《营销总监培训课程》内容

在今天这个竞争激烈的商业环境中,作为一家公司的营销总监,你是否感到压力重重?你是否在寻找一种方式来提升你的销售业绩,激发你的团队潜力,并在市场中占据优势?如果你的答案是肯定的,营销总监作…

2. 行为模式 - 命令模式

亦称: 动作、事务、Action、Transaction、Command 意图 命令模式是一种行为设计模式, 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销…

C++之深拷贝进阶

目录 拷贝构造函数的深拷贝进阶版本 赋值运算符重载的深拷贝进阶 总结 上期我们学习了C中深拷贝的传统版本,今天我们将学习更为高效的版本。 拷贝构造函数的深拷贝进阶版本 传统版本代码如下: string(string& s):_str(new char[strlen(s._str)…

前端视角看待在百模大战中AI行业发展有何新趋势?

在百模大战中AI行业发展有何新现象? 前端开发者视角下的AI趋势 随着人工智能(AI)在各行各业的应用,AI技术的发展日新月异。在这个过程中,百模大战成为了AI行业的一个重要现象。 百模大战是指多个模型在各种任务中的…

Docker——微服务的部署

Docker——微服务的部署 文章目录 Docker——微服务的部署初识DockerDocker与虚拟机Docker架构安装DockerCentOS安装Docker卸载(可选)安装docker启动docker配置镜像加速 Docker的基本操作Docker的基本操作——镜像Docker基本操作——容器Docker基本操作—…

前端案例—antd的表单项默认值提交时没有生效

前端案例—antd的表单项默认值提交时没有生效 <Form onFinish{handleCommit} initialValues{{"ruleApplyDate":{"type":0}}} ><Form.Item{...formItemLayout}label"规则应用时间"name"ruleApplyDate"requiredstyle{{ margin:…

进入不了Bios?进入Bios的方法都在这了,肯定能进!

前言 有些小伙伴可能在重装系统的第一步就卡住了&#xff0c;接着就放弃了。哇哈哈哈啊&#xff0c;先让小白笑会&#xff5e; 根据小白十二年的装机经验&#xff0c;不同主板进入Bios的时候有不同的姿势。也许要蹲着大喊Bios才能进入呢&#xff1f;要不试试&#xff1f; 好了…

自动化框架如何搭建?让10年阿里自动化测试老司机帮你搞定!自动化测试脚本怎么写?

一、何为框架&#xff1f;何为自动化测试框架&#xff1f; 无论是日常技术交流&#xff0c;还是在自动化测试实践中&#xff0c;经常会听到一个词叫&#xff1a;框架。之前对“框架”这个词知其然不知其所以然。现在看过一些资料以及加上我自己的一些实践有了我自己的一些看法…

测试开发体系介绍——测试体系介绍-L1

目录&#xff1a; 软件测试基础概念 软件测试:软件测试作用:软件缺陷:软件测试原则:软件测试对象:测试用例软件开发流程 软件:软件生命周期:软件开发流程:瀑布模型:瀑布模型优缺点敏捷开发模型: XP - 极限编程:SCRUM:DevOps&#xff1a;DevOps 生命周期&#xff1a;DevOps 对发…

C语言—每日选择题—Day58

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 下面字符常量正确的是&#xff08; &#xff09; A&#xff1a;"c" B&#xff1a;\\ C&#xff1a;n D&#xff1a;ab 答案及解析…

金蝶云星空业务对象添加网控设置

文章目录 金蝶云星空业务对象添加网控设置排查是否已经网控设置网控设置 金蝶云星空业务对象添加网控设置 排查是否已经网控设置 网控设置

这6点电缆故障测试仪的使用方法为什么这么重要?

电缆故障检测一直是电力检测工人定期需要做的一件事&#xff0c;通过定期对电缆线的检测&#xff0c;可以排除电缆线的一些故障&#xff0c;从而让电缆线可以正常工作&#xff0c;方便千家万户&#xff01;然而电力检测工人用来检测电缆故障的设备&#xff0c;通常就是电缆故障…

如何将采购时间从几天缩短为几小时?

从事采购工作时&#xff0c;采购需要多长时间是面临的常见挑战之一。 采购是供应链中的一个环节&#xff0c;大家都不想看到整个流程被拖慢&#xff0c;但很多时候&#xff0c;事情往往向超出控制范围的方向发展。不过&#xff0c;企业可以通过多种方式简化采购和管理整个采购…

【JavaWeb学习笔记】14 - 三大组件其二 Listener Filter

API文档JAVA_EE_api_中英文对照版 Listener 一、监听器Listener 1. Listener监听器它是JavaWeb的三大组件之一。 JavaWeb的三大组件分别是: Servlet程序、Listener监听器、Filter过滤器 2. Listener是JavaEE的规范&#xff0c;就是接口 3.监听器的作用是&#xff0c;监听某…