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

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

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

工厂设计模式案例研究相关推荐

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

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

  2. java工厂设计模式(适合新人)

    设计模式最常用的就是单例和工厂模式,单例的话主要是面试中会经常遇到,而工厂实际应用比较多,面试出现的几率也不小,话不多说,开始今天的课程. 1,什么是工厂设计模式 个人理解:工厂设计模式可以理解为一个 ...

  3. 设计模式--静态工厂、简单工厂方法案例分析

    简介 1.学习本篇文章,了解简单工厂设计模式的使用场景. 2.如何使用简单工厂模式. 3.简单工厂模式能解决什么问题? 场景 现在有一家外卖小店需要从生产一份外卖开始进行考虑设计,当客户在网上点出不同 ...

  4. 单例模式 ,多例模式及工厂设计模式的简单案例介绍

    目录 单例设计模式的简单实现 多例设计模式的简单实现 工厂设计模式 总结 单例设计模式的简单实现 单例模式也有多种不同实现 ,本篇只介绍了[饿汉]与[懒汉]两种: 1. "饿汉": ...

  5. SOA 案例研究:SOA 设计

    本文是面向服务的体系结构 (SOA) 系列之一,主要通过名为 JKHL Enterprises (JKHLE) 的虚构公司阐述一个案例研究.本文的案例研究重点是与 SOA 设计(更具体地说是服务和流的 ...

  6. 谷歌maps菜单语言设置_Google Maps:拯救未来之路— UX案例研究

    谷歌maps菜单语言设置 I have a lousy sense of direction, so Google Maps has always been my right-hand app. On ...

  7. 用户体验改善案例_优化用户体验案例研究的五种方法

    用户体验改善案例 重点 (Top highlight) I've had the opportunity to give several portfolio reviews, and I want t ...

  8. 抽象工厂和工厂方法示例_抽象工厂设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

  9. java中iterator_如何在Java中读取CSV文件-Iterator和Decorator的案例研究

    java中iterator 在本文中,我将讨论如何使用Apache Common CSV读取CSV(逗号分隔值)文件. 从这个案例研究中,我们将学习如何在设计模式的上下文中使用Iterator和Dec ...

最新文章

  1. BZOJ1086:[SCOI2005]王室联邦——题解
  2. 设置程序默认打开方式
  3. 改善Java应用程序性能的快速技巧
  4. 乞力马扎罗山 海明威_我如何对海明威编辑器(一种流行的写作应用程序)进行反向工程,并从泰国的海滩上构建了自己的数据库
  5. UICollectionView 应用
  6. 维基百科(wikipedia)数据下载(含地理数据)
  7. rgb颜色查询工具_《我的眼睛–图灵识别》第三章:基础:颜色识别
  8. java 格式化字符串
  9. ubuntu 常用命令锦集
  10. java 拦截器实现接口调用频率限制
  11. Fedora9虚拟机下与windows共享文件
  12. github加速神器
  13. Google play billing(Google play 内支付) 上篇
  14. 从理解透视到场景构图
  15. win10系统 没有wifi图标 WiFi列表没有显示
  16. 数字孪生使用云流化的优势
  17. SOLIDWORKS如何简单高效地自动生成模型视图和标注
  18. 大数据分析及挖掘技术
  19. crontab 简明教程
  20. 【Windows】能上QQ却打不开网页(提示未连接到互联网,代理服务器出现问题,或者地址有误。)的解决办法

热门文章

  1. tomcat(15)Digester库
  2. SonarQube 8.3.x中的Maven项目的测试覆盖率报告
  3. activemq消息持久化_ActiveMQ 5.x中的消息持久性
  4. pcl_openmap_OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分
  5. 同步代码和异步代码_告别异步代码
  6. junit junit_使用junit做其他事情
  7. CUBA 7.2 –有什么新功能?
  8. java 从未导入_Java 8的10个您从未听说过的功能
  9. Spring休眠教程
  10. Redis Client Lettuce 5 GA发布