工厂模式个人案例_工厂设计模式案例研究

工厂模式个人案例

我有一份工作来检查我们的项目代码质量。 如果我在项目中发现任何障碍,必须将其报告给我的团队负责人。 我发现了很多漏洞,我认为可以在博客上进行讨论。 不是嘲笑作者,而是一起学习和改进自己。

像这段代码一样,这是我在我们的代码中找到的部分。

public ContactInfoBean(final Reseller resellerInfo) {switch(resellerInfo.getType()) {case PROGRAM_CONTACT:readExecutiveInfo(resellerInfo);break;case FILE_CONTACT:readOperationalInfo(resellerInfo);break;default:break;}}

该代码可以正常工作,并且可以很好地完成工作。 但是使用此代码样式会出现一些问题。 此类将随着业务的变化而增长,与往常一样,较大的级别是维持这种状态的“商户”。 最有可能具有上述目的的这一类称为低内聚性。

更好的面向对象的方法

对于上述情况,更好的方法是使用“工厂设计模式”。 我们可以让READER的工厂根据其类型生成每个实例。 扩展实例类型会更容易,因为我们只需要创建一个新类并在Factory类中进行一些修改即可。 呼叫者类别不会增长,并且将保持现状。

public interface InfoReader {public void readInfo();}
public class ExecutiveReader implements InfoReader {public void readInfo() {// override}}
public class OperationalReader implements InfoReader {public void readInfo() {// override}}

和工厂

public class InfoReaderFactory {private static final int PROGRAM_CONTACT = 1;private static final int FILE_CONTACT = 2;public static InfoReader getInstance(Reseller resellerInfo) {InfoReader instance = null;switch (resellerInfo.getType()) {case PROGRAM_CONTACT:instance = new ExecutiveReader();break;case FILE_CONTACT:instance = new OperationalReader();break;default:throw new IllegalArgumentException('Unknown Reseller');}return instance;}}

现在,来电者

InfoReader reader = InfoReaderFactory.getInstance(resellerInfo);reader.readInfo();

好处

使用Factory Design Pattern处理这种情况,我们可以获得一些好处,

  • 为一个任务指定一个类别意味着更容易维护,因为一个类别仅用于一个目的(模块化/高内聚性)。 即:Operational Reader仅用于操作目的而无其他目的读取数据。 以防万一,在将来的一天中,我们需要另一台Reader(例如:NonOperationalReader)。 我们只需要创建一个扩展(或实现)InfoReader类的新类,然后就可以覆盖我们自己的readInfo()函数。 此类Caller类不会产生任何影响。 我们只需要在Factory代码中进行一些修改即可。
public class InfoReaderFactory {private static final int PROGRAM_CONTACT = 1;private static final int FILE_CONTACT = 2;private static final int NEW_READER = 3;public static InfoReader getInstance(ResellerInfo resellerInfo) {InfoReader instance = null;switch (resellerInfo.getType()) {case PROGRAM_CONTACT:instance = new ExecutiveReader();break;case FILE_CONTACT:instance = new OperationalReader();break;case NEW_READER:instance = new NonOperationalReader();break;default:throw new IllegalArgumentException('Unknown Reseller');}return instance;}}
  • 父级组件的更高可重用性(继承):由于我们有父类(InfoReader),因此可以将公共函数和事物放入此InfoReader类中,以后所有派生类(ExecutiveReader和OperationalReader)都可以重用InfoReader的公共组件。 避免代码冗余,并可以最大程度地减少编码时间。 即使这取决于您如何执行代码,也无法保证。

但是,它运行得很好,我们应该更改它吗?

显然,答案是否定的。 这只是案例研究,仅供您进一步的经验和知识。 OOP很好,可以在任何适用的地方进行。 但是最重​​要的是,如果它正在运行,请不要更改它。 如果您为了追求某种OOP方法而破坏了整个工作代码,那将是荒谬的。 也不要天真,没有人可以实现完美的代码。 最重要的是我们知道什么是更好的方法。

参考: 案例研究: JCG合作伙伴 Ronald Djunaedi在Naming Exception博客上的工厂设计模式 。


翻译自: https://www.javacodegeeks.com/2012/10/factory-design-pattern-case-study.html

工厂模式个人案例

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

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

相关文章

用Matlab实现字符串分割(split)

我们在这里借助正则表达式函数regexp的split模式。一般语法: S regexp(str, char, split) 其中str是待分割的字符串,char是作为分隔符的字符(可以使用正则表达式)。分割出的结果存在S中。 以下面这样一串字符为例 Hello N…

阅读笔记:基础知识(Java篇)

1. GC机制(垃圾回收机制) 找到垃圾的方法:引用计数法、可达性分析法 回收垃圾的方法:标记清除算法、复制算法、标记整理法、分代算法2. JVM内存划分 线程私有:程序计数器、JVM虚拟机栈、本地方法栈线程公有&#xff1a…

oracle和mysql数据实时同步_异构数据源的CDC实时同步系统——最终选型实战

引言:《异构数据源的CDC实时同步系统》 系列第一篇 (已完成)《零编码打造异构数据实时同步系统——异构数据源CDC之2》 系列第二篇(已完成)《零编码打造异构数据实时同步系统——异构数据源CDC之3》 系列第三篇(已完成)《异构数据源的CDC实时同步系统——最终选型实…

使用DynamoDBMapper插入DynamoDB项目

在上一篇文章中,我们使用DynamoDBMapper来将DynamoDB表映射到Java对象。 插入时,我们的动作几乎相同,但是方式更方便。 为了插入项目,您要做的就是使用对象映射器持久化对象 在我们的例子中,我们将创建一个执行简单插…

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器,sqlserver

今早开机发现,打开SQL Server 2008 的 SQL Server Management Studio,输入sa的密码发现,无法登陆数据库?提示以下错误: “在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请…

matlab 与数据库操作

第一部分:读取数据其相关信息查看 1. 配置数据源 (1).“控制面板”----“管理工具”——“数据源(ODBC)”——“添加”——“创建数据源名称和选择数据库文件”。具体操作见数据源配置: http://blog.c…

PHP05

php05 1、音乐案例删除部分 1)通过执行某些PHP代码获取到指定的数据,填充到html的指定位置 accept属性也可以直接写扩展名,多个扩展名间用英文的逗号分隔 accept".lrc" 允许选中多个文件,文件域属性:multiple 直接写该属…

算术运算导致溢出_CPU的控制器与运算器

计算机基础方面的知识,对于一些非科班出身的同学来讲,一直是他们心中的痛,而对于科班出身的同学,很多同学在工作之后,也意识到自身所学知识的不足与欠缺,想回头补补基础知识。关于计算机基础的课程很多&…

Windows下,Netbeans使用C++的配置方法

如果尚未安装 NetBeans IDE,请转至http://www.netbeans.org/community/releases/,然后下载包含最近的 C/C 支持的 IDE 版本。 如果已安装 NetBeans IDE 但未包含 C/C 支持,请完成以下步骤为 IDE 添加 C/C 支持。 从主菜单中选择“工具”>“…

为了简单起见,Arquillian Chameleon

使用Arquillian时,您需要做的一件事就是定义要在哪个容器下执行所有测试。 这是通过在适配器的类路径中添加依赖项并取决于所使用的模式(嵌入式,托管或远程)来下载的来完成的。 手动安装应用程序服务器。 例如,当在嵌…

matlab 读取文件夹底下所有txt文件

读取matlab 文件夹底下所有的txt 文件包括子文件夹底下的文件。 dirsdir(H:\DCE); for i1:length(dirs); if (dirs(i).isdir && ~strcmp(dirs(i).name,.) && ~strcmp(dirs(i).name,..) ) str_path[H:\DCE\, dirs(i).name]; filedir([str_path,\*.txt]);…

BZOJ4856 JSOI2016 病毒感染 区间DP

传送门 原Word文档 题意:太长不给 这种题目一看就是区间DP 设$f_i$表示治愈了前$i$个村子的时候最少死了多少村民,又设前缀和为$sum_i$,通过枚举折返时最后经过的村子$j$,并且提前计算$i1$到$N$中死的村民数量,可以得到…

go get 的不再src目录中_Go 每日一库之 sqlc:根据 sql 生成代码

简介在 Go 语言中编写数据库操作代码真的非常痛苦!database/sql标准库提供的都是比较底层的接口。我们需要编写大量重复的代码。大量的模板代码不仅写起来烦,而且还容易出错。有时候字段类型修改了一下,可能就需要改动很多地方;添…

查看linux服务器的系统信息

查看linux服务器的系统信息新接手了几台linux的服务器,第一步当然是要了解这些服务器的软硬件配置.现在就写出我这次用的一些命令.首先当然要取得机器的IP,用户名和密码(呵呵,不知道就找原来的管理员要哈)登陆之后,首先看到的就是机器的名称,一般提示符就有了,如[rootlocalhost…

Windows下更改MySQL数据库的存储位置

一.同一主机下位置的转移 在mysql安装完成后,要修改数据库存储的位置,比如从安装目录下的C:\Program Files\MySQL\MySQL Server 5.0\Data文件夹转移到D:\mySQLData文件夹。 1、在D:\下新建mySQLData文件夹 2、停止MySQL服务,将C:\Program Fil…

apk去除签名验证工具安卓版_App 签名过期或泄露怎么办?别担心,Google 已经给出解决方案!...

一、序在将 App 发布到市场之前,很重要的一个步骤就是为 APK 进行签名,大部分时候,这个操作隐藏在了打包的流程中,而不被我们注意到。签名的作用,除了证明 App 的所有权之外,还可以帮助 Android 市场和设备…

初入WEBOTS半个月来的一点总结

对于我这一个从十一假期结束后才刚刚接触webots的小白来说,webots简直就是一个噩梦。在这里记录一下噩梦的发展历程。 在最初安装webots时就遇到了麻烦。安装7.0.3总是出问题。程序找不到接入点。替换dll文件也没有用更新运行库也不行。最好索性重新买固态硬盘做了个…

skype 回放设备出现问题

最近用skype拨打电话换台电脑会出现“回放设备出现问题”,拨通号码后会自动跳掉无法拨通 一直更新声音驱动器,结果发现跟声卡驱动半毛钱关系都没有,是要插入耳麦。

sonar java_修复Sonar中常见的Java安全代码冲突

sonar java本文旨在向您展示如何快速修复最常见的Java安全代码冲突。 它假定您熟悉代码规则和违规的概念以及Sonar如何对其进行报告。 但是,如果您以前从未听过这些术语,则可以阅读Sonar Concepts或即将出版的有关Sonar的书 ,以获取更详细的解…

linux服务器性能查看

################### cpu性能查看 ############################################################1、查看物理cpu个数:cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l2、查看每个物理cpu中的core个数:cat /proc/cpuinfo |grep "…