简单工厂模式小结整理

复杂电磁环境效应下的EMC设计与天线测试实战 电磁兼容(EMC)是电子设备在复杂电磁环境中正常工作的核心能力。从电磁干扰三要素出发,理解辐射发射、传导敏感度及系统级耦合机理,是构建高可靠装备的基础。通过正向设计与频谱规划,可显著降低后期整改成本。在工程应用中,天线隔离度、无源互调产物以及混响室测试成为系统集成的关键难点。随着信息化装备集成度提升,掌握从器件级到系统级的EMC设计与排查思路,对硬件与测试工程师愈发重要。结合技术会议中的实践案例,梳理了电磁环境效应到具体测试方法的落地路径,为多天线系统的电磁兼容设计提供了可操作的参考。 阅读详情

一.代码无错就是好?

class Program
    {
        static void Main(string[] args)
        {
            Console.Write("请输入数字A:");
            string A = Console.ReadLine();
            Console.Write("请选择运算符号(+、-、*、/):");
            string B = Console.ReadLine();
            Console.Write("请输入数字B:");
            string C = Console.ReadLine();
            string D = "";

            if (B == "+")
                D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C));
            if (B == "-")
                D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C));
            if (B == "*")
                D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C));
            if (B == "/")
                D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C));
            Console.WriteLine("结果是:" + D);
        }
}

存在问题:

(1)变量命名,ABCD,变量不带有任何具体含义,非常不规范的;

(2)判断分支,每个条件都要做判断,等于计算机做了三次无用功;

(3)数据输入有效性判断等,如果用户输入的是字符符号而不是数字怎么办?如果除数时,客户输入了0怎么办?


二.代码规范、重构

class Program
    {
        static void Main(string[] args) {
            try{
                Console.Write("请输入数字A:");
                string strNumberA = Console.ReadLine();

                Console.Write("请选择运算符号(+、-、*、/):");
                string strOperate = Console.ReadLine();

                Console.Write("请输入数字B:");
                string strNumberB = Console.ReadLine();

                string strResult = "";

                switch (strOperate)
                {
                    case "+":
                        strResult = Convert.ToString
                        (Convert.ToDouble(strNumberA) + Convert.ToDouble(strNumberB));
                        break;

                    case "-":
                        strResult = Convert.ToString
                        (Convert.ToDouble(strNumberA) - Convert.ToDouble(strNumberB));
                        break;

                    case "*":
                        strResult = Convert.ToString
                        (Convert.ToDouble(strNumberA) * Convert.ToDouble(strNumberB));
                        break;

                    case "/":
                        if (strNumberB != "0")
                            strResult = Convert.ToString
                         (Convert.ToDouble(strNumberA)/Convert.ToDouble(strNumberB));
                        else
                            strResult = "除数不能为0";
                        break;
                }
                Console.WriteLine("结果是:" + strResult);
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("您的输入有错:" + ex.Message);
            }
        }
}

要用面向对象的编程方法去实现

比如这个程序,先要求输入两个数和运算符号,然后根据运算符号判断选择如何运算,得到结果,

这样的思维却使得我们的程序只为满足实现当前的需求,程序不容易维护,不容易扩展,更不容易复用。从而达不到高质量代码的要求。


如果要求再写一个windows的计算器,现在的代码就能复用吗?

代码复制过去不就行了吗?---->改动又不大,不算麻烦。

这其实是非常不好的编码习惯,因为当你的代码中重复的代码多到一定程度,维护的时候,可能就是一场灾难。

越大的系统,这种方式带来的问题越严重,编程有一原则,就是用尽可能的办法去避免重复。

这段代码,将控制台有关的和计算器有关的分开会则么样。


三.业务的封装


客户端代码

 class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.Write("请输入数字A:");
                string strNumberA = Console.ReadLine();

                Console.Write("请选择运算符号(+、-、*、/):");
                string strOperate = Console.ReadLine();

                Console.Write("请输入数字B:");
                string strNumberB = Console.ReadLine();

                string strResult = "";
                strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), strOperate));

                Console.WriteLine("结果是:" + strResult);
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("您的输入有错:" + ex.Message);
            }
        }
    }


Operation类

class Operation
    {
        public static double GetResult(double numberA, double numbleB, string operate)
        {
            double result = 0;
            switch (operate)
            {
                case "+":
                    result = numberA + numbleB;
                    break;
                case "-":
                    result = numberA - numbleB;
                    break;
                case "*":
                    result = numberA * numbleB;
                    break;
                case "/":
                    result = numberA / numbleB;
                    break;
            }
            return result;
        }
    }

修改后:不单是Windows程序,Web版程序需要运算可以用它,PDA,手机等需要移动系统的软件需要运算也可以用它

但是只用了封装,继承和多态未体现。


四.简单工厂模式

客户端代码

static void Main(string[] args)
        {
            try
            {
                Console.Write("请输入数字A:");
                string strNumberA = Console.ReadLine();

                Console.Write("请选择运算符号(+、-、*、/):");
                string strOperate = Console.ReadLine();

                Console.Write("请输入数字B:");
                string strNumberB = Console.ReadLine();

                Operation oper;
                oper = OperationFactory.createOperate(strOperate);

                oper.NumberA = Convert.ToDouble(strNumberA);
                oper.NumberB = Convert.ToDouble(strNumberB);

                double result = oper.GetResult();

                Console.WriteLine("结果是:" + result);
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("您的输入有错:" + ex.Message);
            }
        }

简单运算工厂类

class OperationFactory
    {
        public static Operation createOperate(string operate)
        {
            Operation oper = null;
            switch (operate)
            {
                case"+":
                    oper = new OperationAdd();
                    break;
                case"-":
                    oper = new OperationSub();
                    break;
                case"*":
                    oper = new OperationMul();
                    break;
                case "/":
                    oper = new OperationDiv();
                    break;
            }
            return oper;
        }
    }

Operation 运算类

class Operation
    {
        private double _numberA = 0;
        private double _numberB = 0;

        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }
        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }


加减乘除类

class OperationDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumberB == 0)
                throw new Exception("除数不能为0.");
            result = NumberA / NumberB;
            return result;
        }
    }

优点:

1.若要修改加法  只需要改 OperationAdd

2.若要增加各种复杂的运算 只要增加相应的运算子类+运算工厂中的 Switch分支

3.若要改界面 则不需要修改运算


【Godot】实现对话系统 在 Godot 中实现对话系统(Dialogue System)是游戏开发中的常见需求。Godot本身自带的的灵活性和轻量级脚本语言 GDScript 使得实现对话系统变得相对简单。以下是实现一个基础对话系统的示例。(语言为GDScript但高亮选择Python因为类似)通过 Godot 和 GDScript,我们可以给我们的游戏实现一个对话系统。从简单的文本显示到复杂的分支对话,Godot 提供了足够的灵活性来满足我们的需求。如果需要更高级的功能,可以尝试使用现成的插件如 Dialogic。 阅读详情

相关推荐

八股已死、场景当立(Docker篇)

本文总结了Docker相关的面试八股文,重点介绍了Docker在Java开发中的应用。主要内容包括:Docker容器与虚拟机的区别及其对Java应用性能的影响;如何为Java应用构建优化镜像;Docker常用命令在Java容器管理中的使用;Docker网络模式与数据卷在Java微服务中的配置;使用Docker Compose部署Java+MySQL微服务的方法;以及为Java应用配置健康检查的重要性。文章还通过具体示例说明了Nginx容器挂载、日志收集等常见场景的实现方式,为Java开发者提供了实用的Doc

qq_55253420的博客 714

JAVA设计模式大总结(三)--- b站尚硅谷设计模式之 工厂模式(三种) 图解+小项目的代码实现 整理(超详)

1.项目引入: 2.传统做法: 3.代码实现(部分) 4.传统做法优缺点: 例如: 前面的Orderpizz代码都是if跟else语句,那要是有很多的orderpizz那要改到吐,所以考虑再做一层类(我的理解是缓冲),然后Orderpizz类去实现或者继承,之后改代码只需要改一个类就行了 5.改进思路: 下面重头戏三连来了!!!! (一)简单工厂模式:(也叫静态工厂模式) 1. 2.改进完代码: (二)工厂方法模式: 1.项目需求引入 类图: OK上面的扩展性又得到了增加,基于

XJ200012的博客 813

记录:MCGS和正弦变频器通讯

触摸屏实现对变频器:启动、停止、频率设定、频率读取、电压读取、电流读取。通讯方式Modbus RTU。

m0_61837027的博客 1026

首发!阿里大佬整理的万字MyBatis实战笔记,精简易懂,开源免费下载

MyBatis作为国内经常使用的持久层框架,其内部代码的设计非常优秀。比如在开发过程中,有能力对框架进行深度的定制化开发,解决BUG也更加得心应手!另外学习开发者是如何设计高扩展性、低耦合性的代码,便于在自己的开发场景中应用。 而在跳槽的时候MyBatis更是面试必问的内容,那你对于MyBatis又掌握了多少呢?想学习MyBatisK但,市面上真正适合学习的MyBatis资料太少,有的书或资料虽然讲得比较深入,但是语言晦涩难懂,大多数人看完这些书基本都是从入门到放弃。学透MyBatis源码难道就真的就没有一

Java_supermanNO1的博客 2674

评分卡建模学习(一)————数据预处理part.3

目录六、数据处理的思路及代码(一)对缺失值的处理:在我这个数据预处理的part.1板块(二)对异常值的处理:在我这个数据预处理的part.2板块(三)数据归一化、标准化:在我这个数据预处理的part.2板块(四)非结构化数据转变+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++———————————————————————————————————————————++++++++++++++++++++++++++

Morven_dai的博客 898

【数据分析】比较SparCC、Pearson和Spearman相关性估计方法在合成组学数据上的表现

【数据分析】比较SparCC、Pearson和Spearman相关性估计方法在合成组学数据上的表现

专注生信领域 659

首发!阿里大佬整理万字MyBatis实战笔记,精简易懂,开源免费下载

MyBatis作为国内经常使用的持久层框架,其内部代码的设计非常优秀。比如在开发过程中,有能力对框架进行深度的定制化开发,解决BUG也更加得心应手!另外学习开发者是如何设计高扩展性、低耦合性的代码,便于在自己的开发场景中应用。 而在跳槽的时候MyBatis更是面试必问的内容,那你对于MyBatis又掌握了多少呢?想学习MyBatisK但,市面上真正适合学习的MyBatis资料太少,有的书或资料虽然讲得比较深入,但是语言晦涩难懂,大多数人看完这些书基本都是从入门到放弃。学透MyBatis源码难道就真的就没有一

Java____superman的博客 303

基于MATLAB的逐次变分模态分解(SVMD)算法详解

本文详细介绍了基于MATLAB的逐次变分模态分解(SVMD)算法。SVMD是一种改进的变分模态分解方法,通过逐次分解机制克服传统VMD算法需要预设模态数量的缺陷。文章从信号分解方法的发展历程入手,阐述了SVMD的核心优势与创新点,包括参数敏感性降低、自适应分解能力和更好的频率分离性能。详细解析了SVMD的数学模型和优化求解过程,重点讨论了变分问题构建、ADMM优化方法和停止准则设计。通过MATLAB代码实现展示了SVMD的具体应用,包括参数初始化、信号预处理、模态提取和残余信号更新等关键步骤。

qq_42212808的博客 130

线程池整理汇总

线程池

weixin_40017062的博客 1255

8,9,10,11,12,13代CPU特制win7 64位系统

对于7代以上的CPU装win7,在UEFI的模式下,如果不提前注入显卡驱动,就会一直卡在LOGO界面。对于此情况,我们推出一个内置了显卡和USB驱动的特制版win7系统。由于单文件已经大于了4G,所以推荐使用rufus来写入镜像安装。如还有问题,请记录下电脑配置,联系QQ11717907。制作完成以后,就可以通过U盘启动安装了。

海康威视技术支持 7250

如何使用 Python 爬取 58 同城招聘信息

职位名称:招聘的岗位名称,如“前端开发”、“数据分析师”等。公司名称:招聘公司的名称。薪资待遇:职位的薪资范围,通常以“面议”、“10k-20k”这样的形式表示。工作地点:公司所在的城市及具体地址。公司福利:例如五险一金、带薪年假、绩效奖金等。发布时间:职位信息的发布时间。一个典型的招聘页面 URL 格式通常如下:在这个页面上,职位信息会分页展示,爬虫需要模拟翻页,获取多个页面的招聘信息。

2201_76125261的博客 1291

工厂模式

一、 前言 1.1 为什么学习设计模式 学习编程的人一定会听过设计模式,第一次听到这个词的时候感觉非常高大上,也在网络上搜索阅读过一些设计模式,但都零零散散不够系统,只能片面地了解设计模式,因此决定完整的阅读学习传说中的设计模式,同时也开始通过博客来记录巩固每次的学习成果。 1.2 工厂模式简介 工厂模式主要分为以下三类: 简单工厂模式 工厂方法模式 抽象工厂模式 因此本文将分别介...

qq_36035517的博客 202

R语言机器学习算法实战系列(十三)随机森林生存分析构建预后模型 (Random Survival Forest)

本教程运用随机森林生存分析筛选与患者生存状态显著相关特征。该方法借随机森林这一强大机器学习算法,构建多棵决策树并集成结果,以提高生存分析准确性,识别关键生物标志物。接着,利用选定特征构建风险得分,将多个特征转化为单一数值,量化患者风险水平。之后,依据风险得分将患者分为高、低风险亚型,为临床治疗提供个性化指导。最后,通过分析时间依赖的 ROC 曲线评估模型长期预测能力。此曲线计算不同阈值下的真正例率与假正例率,在多个时间点评估,全面展现模型长期稳定性与准确性。

专注生信领域 2020

首发 阿里P8整理万字MyBatis实战笔记,精简易懂,开源免费下载

MyBatis作为国内经常使用的持久层框架,其内部代码的设计非常优秀。比如在开发过程中,有能力对框架进行深度的定制化开发,解决BUG也更加得心应手!另外学习开发者是如何设计高扩展性、低耦合性的代码,便于在自己的开发场景中应用。而在跳槽的时候MyBatis更是面试必问的内容,那你对于MyBatis又掌握了多少呢?想学习MyBatisK但,市面上真正适合学习的MyBatis资料太少,有的书或资料虽然讲得比较深入,但是语言晦涩难懂,大多数人看完这些书基本都是从入门到放弃。学透MyBatis源码难道就真的就没有一种

m0_54854371的博客 304

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

首发 阿里年薪100W架构师整理万字MyBatis实战笔记,精简易懂,开源免费下载

MyBatis作为国内经常使用的持久层框架,其内部代码的设计非常优秀。比如在开发过程中,有能力对框架进行深度的定制化开发,解决BUG也更加得心应手!另外学习开发者是如何设计高扩展性、低耦合性的代码,便于在自己的开发场景中应用。 而在跳槽的时候MyBatis更是面试必问的内容,那你对于MyBatis又掌握了多少呢?想学习MyBatisK但,市面上真正适合学习的MyBatis资料太少,有的书或资料虽然讲得比较深入,但是语言晦涩难懂,大多数人看完这些书基本都是从入门到放弃。学透MyBatis源码难道就真的就没有一

m0_70083198的博客 158

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android开发相关资料整理【2011-09-30】

解决sruts2..6中文问题 Zip解压,加压 BASE64编码解码 svn分支的在项目中的使用 Spring DataSource 使用简介 一个在线将pdf文件转成word的网站 Java常用时间操作工具类 分段下载文件--java版 java和SNMP技术的网络拓扑发现和物理拓扑发现入门 Java的SPI机制 java和c++的比较 maven ...

weixin_30244889的博客 136

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SSM框架常考面试题汇集(Java面试)

欢迎你的阅读,本文整理了JAVA面试SSM框架常考的面试题,大家一起学习共同进步。 JAVA基础面试问题请参考:JAVA基础问题汇集 小编按:Spring-SpringMVC-Mybatis 顺序整理 文章目录1. 简述什么是 IoC 和 DI ?2. DI 是如何实现的?3. 解释一下什么叫 AOP (面向切面编程)?4. 阐述 Spring 框架中 Bean 的生命周期?5....

末尾卡片和博主交流学习! 1万+

写在前面

这是一个系列,在这个系列里面,将从基础知识六大设计原则、设计模式中类的关系开始,对设计模式进行分析,示例源码采用Objective-C语言,讲解也是基于IOS进行。由于本人编写本系列文章也是边学习边整理,因此持续的时间会比较长,更多的是希望和大家一起交流,共同进步。文章中有错误的地方或者不足的地方,欢迎大家提出宝贵的意见。 下面的目录结构是现在的规划,后期可能会有一些调整...

weixin_33893473的博客 196

软件工程笔记:从重构到模式

从重构到模式 — 笔记整理自 北京理工大学 计算机学院 什么是模式 模式记录了专家的经验,并且让非专家也能理解,其核心是对真实世界的抽象和组织 模式是发展的,是经过验证的专家经验的重用 模式的名称构成了一份词汇表,帮助开发者更好的交流,更快的理解一个系统,更容易的重组一个系统 模式的构成 语境 问题 解决方案 模式分类 代码模式——特定编程语言相关 分析模式——透过需求表面了解本质问题 设计模式——局部强化 架构模式——软件系统的基础结构组织模型 建议学习顺序 代码模式(忽略) 设计模式(重点

Wang的专栏 531

收藏网站68

http://blog.youkuaiyun.com/Fly_o0o/article/details/16968187   Intent以及IntentFilter http://blog.youkuaiyun.com/galensphang/article/details/13512015   Android系统广播[Broadcast]机制分析 http://blog.youkuaiyun.com/Siobhan/a

chun1234567的专栏 253

iOS架构模式浅析

  这是以前旧博客在13年规划写的一个系列,写了一部分内容,还没有完成。现在重新整理编写。计划从基础知识六大设计原则、设计模式中类的关系开始,然后会对iOS开发中的常用架构模式进行介绍,最后对GoF的23种设计模式进行分析。由于本人编写本系列文章时也是边学习边整理,因此持续的时间会比较长,更多的是希望和大家一起交流,共同进步。文章中有错误的地方或者不足的地方,欢迎大家提出宝贵的意见。   下面的...

weixin_33936401的博客 156

阿里弃用Hibernate,却用MyBatis,竟然是因为这个!

最近一直在研究MyBatis源码,作为国内经常使用的持久层框架,其内部代码的设计非常优秀。比如在开发过程中,有能力对框架进行深度的定制化开发,解决BUG也更加得心应手!另外学习开发者是如何设计高扩展性、低耦合性的代码,便于在自己的开发场景中应用。 而在Mybatis中,缓存是一个绕不开的话题。比如说,MyBatis的一级缓存竟然还会引来麻烦? MyBatis 一级缓存与 SpringFramework 的声明式事务有冲突吗?在 Service 中开启事务,连续查询两次同样的数据,结果两次查询的结果不一致。这

Java_supermanNO1的博客 2232

Android—Dagger2-让你爱不释手--基础依赖注入框架篇(附视频讲解)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

code8889的博客 1101
上一篇: [置顶] 一位ACMer过来人的心得
下一篇: win7下jdk安装环境变量配置
Matrix_Reloaded
博客等级 码龄14年 18粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值