工厂设计模式案例研究
像这段代码一样,这是我在我们的代码中找到的部分。
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
工厂设计模式案例研究相关推荐
- 工厂模式个人案例_工厂设计模式案例研究
工厂模式个人案例 我有一份工作来检查我们的项目代码质量. 如果我在项目中发现任何障碍,必须将其报告给我的团队负责人. 我发现了很多漏洞,我认为可以在博客上进行讨论. 不是嘲笑作者,而是一起学习和改进自 ...
- java工厂设计模式(适合新人)
设计模式最常用的就是单例和工厂模式,单例的话主要是面试中会经常遇到,而工厂实际应用比较多,面试出现的几率也不小,话不多说,开始今天的课程. 1,什么是工厂设计模式 个人理解:工厂设计模式可以理解为一个 ...
- 设计模式--静态工厂、简单工厂方法案例分析
简介 1.学习本篇文章,了解简单工厂设计模式的使用场景. 2.如何使用简单工厂模式. 3.简单工厂模式能解决什么问题? 场景 现在有一家外卖小店需要从生产一份外卖开始进行考虑设计,当客户在网上点出不同 ...
- 单例模式 ,多例模式及工厂设计模式的简单案例介绍
目录 单例设计模式的简单实现 多例设计模式的简单实现 工厂设计模式 总结 单例设计模式的简单实现 单例模式也有多种不同实现 ,本篇只介绍了[饿汉]与[懒汉]两种: 1. "饿汉": ...
- SOA 案例研究:SOA 设计
本文是面向服务的体系结构 (SOA) 系列之一,主要通过名为 JKHL Enterprises (JKHLE) 的虚构公司阐述一个案例研究.本文的案例研究重点是与 SOA 设计(更具体地说是服务和流的 ...
- 谷歌maps菜单语言设置_Google Maps:拯救未来之路— UX案例研究
谷歌maps菜单语言设置 I have a lousy sense of direction, so Google Maps has always been my right-hand app. On ...
- 用户体验改善案例_优化用户体验案例研究的五种方法
用户体验改善案例 重点 (Top highlight) I've had the opportunity to give several portfolio reviews, and I want t ...
- 抽象工厂和工厂方法示例_抽象工厂设计模式示例
抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...
- java中iterator_如何在Java中读取CSV文件-Iterator和Decorator的案例研究
java中iterator 在本文中,我将讨论如何使用Apache Common CSV读取CSV(逗号分隔值)文件. 从这个案例研究中,我们将学习如何在设计模式的上下文中使用Iterator和Dec ...
最新文章
- BZOJ1086:[SCOI2005]王室联邦——题解
- 设置程序默认打开方式
- 改善Java应用程序性能的快速技巧
- 乞力马扎罗山 海明威_我如何对海明威编辑器(一种流行的写作应用程序)进行反向工程,并从泰国的海滩上构建了自己的数据库
- UICollectionView 应用
- 维基百科(wikipedia)数据下载(含地理数据)
- rgb颜色查询工具_《我的眼睛–图灵识别》第三章:基础:颜色识别
- java 格式化字符串
- ubuntu 常用命令锦集
- java 拦截器实现接口调用频率限制
- Fedora9虚拟机下与windows共享文件
- github加速神器
- Google play billing(Google play 内支付) 上篇
- 从理解透视到场景构图
- win10系统 没有wifi图标 WiFi列表没有显示
- 数字孪生使用云流化的优势
- SOLIDWORKS如何简单高效地自动生成模型视图和标注
- 大数据分析及挖掘技术
- crontab 简明教程
- 【Windows】能上QQ却打不开网页(提示未连接到互联网,代理服务器出现问题,或者地址有误。)的解决办法
热门文章
- tomcat(15)Digester库
- SonarQube 8.3.x中的Maven项目的测试覆盖率报告
- activemq消息持久化_ActiveMQ 5.x中的消息持久性
- pcl_openmap_OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分
- 同步代码和异步代码_告别异步代码
- junit junit_使用junit做其他事情
- CUBA 7.2 –有什么新功能?
- java 从未导入_Java 8的10个您从未听说过的功能
- Spring休眠教程
- Redis Client Lettuce 5 GA发布