面向对象语言具有非常强大的多态性功能,用于删除代码中的if / else或切换大小写。

没有条件的代码易于阅读。 在某些地方必须放置它们,其中一个示例是Factory / ServiceProvider类。

我敢肯定,您已经看到IF-ELSEIF的工厂课程了,而且规模还在不断扩大。

在此博客中,我将分享一些技巧,您可以使用这些技巧来消除工厂课堂上的情况。

我将使用以下代码段作为示例:

public static Validator newInstance(String validatorType) {if ("INT".equals(validatorType))return new IntValidator();else if ("DATE".equals(validatorType))return new DateValidator();else if ("LOOKUPVALUE".equals(validatorType))return new LookupValueValidator();else if ("STRINGPATTERN".equals(validatorType))return new StringPatternValidator();return null;}

反射

这是您要删除条件时想到的第一件事。 您会感到框架开发人员的感觉!

public static Validator newInstance(String validatorClass) {return Class.forName(validatorClass).newInstance();      }

这看起来很简单,但唯一的问题是调用者必须记住完全限定的类名,并且有时可能会出现问题。

地图

映射可用于将实际的类实例映射到一些用户友好的名称:

Map<String, Validator> validators =  new HashMap<String,Validator>(){{put("INT",new IntValidator());put("LOOKUPVALUE",new LookupValueValidator());put("DATE",new DateValidator());put("STRINGPATTERN",new StringPatternValidator());}};public Validator newInstance(String validatorType) {return validators.get(validatorType);}

这看起来也很整洁,没有反射的开销。

枚举

这很有趣:

enum ValidatorType {INT {public Validator create() {return new IntValidator();}},LOOKUPVALUE {public Validator create() {return new LookupValueValidator();}},DATE {public Validator create() {return new DateValidator();}};public Validator create() {return null;}}public Validator newInstance(ValidatorType validatorType) {return validatorType.create();}

此方法使用enum方法删除条件,问题之一是每种类型都需要Enum。 您不想创建大量的文件!

我个人喜欢这种方法。

结论

如果使用else或switch大小写会使代码难以理解,则应尽量避免使用它们。 应该使用语言构造来避免某些切换情况。

我们应该尝试在没有IF-ELSE的情况下进行编码,这将迫使我们提出更好的解决方案。

翻译自: https://www.javacodegeeks.com/2014/10/factory-without-if-else.html

没有IF-ELSE的工厂相关推荐

  1. 【Spring】工厂模式解耦

    问题: 程序的耦合    耦合:程序间的依赖关系    包括:类之间的依赖       方法之间的依赖 解耦:降低程序之间的耦合关系    实际开发:编译期不依赖,运行期才依赖    解耦思路:    ...

  2. 【Design pattern】简单工厂过渡策略模式

    把自己当做小菜来跟学<大话设计模式>,跟着故事的思路来走 简单工厂模式:实现一个计算器代码 策略模式:商场打折代码 根据大鸟和小菜的故事,一步步的完善问题的过程!

  3. GOF23设计模式(创建型模式)工厂模式

    目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...

  4. (14)某工业生产部门根据国家计划的安排, 拟将某种高效率的5台机器,分配给所属的3个工厂A,B,C,各工厂在获得这种机器后,可以为国家盈利的情况如表4-10所示。

    问题描述: (14)某工业生产部门根据国家计划的安排, 拟将某种高效率的5台机器,分配给所属的3个工厂A,B,C,各工厂在获得这种机器后,可以为国家盈利的情况如表4-10所示.问:这5台机器如何分配给 ...

  5. 抽象工厂————三层架构

    抽象工厂作用:降低BLL和Model层耦合度 核心思想:1.通过接口类实现对象的分离   2.通过一个类,实现指定对象的创建,并且这个类通过配置文件决定获取哪个对象 这样只要调用一个接口和这个类,就能 ...

  6. 大话设计模式之简单的工厂模式

    第一章:代码无错就是优-简单的工厂模式 先建立一个计算类Operation Operation.h文件 @interface Operation : NSObject@property(nonatom ...

  7. 设计模式之简单工厂模式

    一.概述 工厂模式具体包括了简单工厂.工厂方法.抽象工厂,它们是按照从简单到复杂的顺序排列的,属于设计模式中的创建型,其中简单工厂并不属于GOF的23中模式.   但是它是理解其它的工厂模式的一个很好 ...

  8. 基础设计模式:单例模式+工厂模式+注册树模式

    单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次. 使用场景: 一般数据库实例都会用单例模式 实现: 单例设计模式就是要一个类只能实例化一个对象. 要想让一个类只能实 ...

  9. 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...

    在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV, ...

  10. java 密钥工厂 desede_20145212 实验五《Java网络编程》

    20145212 实验五<Java网络编程> 一.实验内容1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代 ...

最新文章

  1. 历史版本_DNF:历史版本十大经典地图,没经历过那个时代的人不会明白的
  2. .net 面试题系列文章三(附答案)
  3. 希尔排序(Shell's Sort)的C语言实现
  4. RocketMQ避坑指南:springcloud教程权威指南
  5. 解决:DuplicateMappingException: Table [xx] contains physical column name referred to by multiple ... .
  6. linux运行tcl脚本语言,Tool Command Language (Tcl)初体验
  7. vue watch的监听
  8. 24分钟让AI跑起飞车类游戏
  9. ueditor富文本
  10. 计算机如何重装网络,电脑无网络怎么重装?离线一键重装win7系统教程
  11. 计算机组装后要干什么,电脑组装完后还有哪些事需要干?
  12. 造成笔记本电池损耗的主要原因
  13. uniapp中scroll-view的下拉刷新
  14. Could not clean server of obsolete
  15. 上海宝付高谈保险扣费如何追回
  16. 天猫精灵方糖AI智能音箱拆解报告
  17. JAVA父类强转子类
  18. 旅行社旅游APP开发维护经验
  19. Oracle 存储过程中自定义异常
  20. 网上超火的微信昵称和头像创意玩法 个性又帅气 有意思!

热门文章

  1. 迷宫问题---递归解决
  2. 用startSmoothScroll实现RecyclerView滚动到指定位置并置顶,含有动画。
  3. js 时间戳转换成时间_JavaScript 时间戳转成日期格式
  4. tomcat(18)部署器
  5. 谷粒商城RabbitMQ锁库存逻辑详解--新理解(长文警告)
  6. Spring boot(十二):Spring boot 如何测试、打包、部署
  7. 在Java中如何设置一个定时任务,在每天的一个时间点自动执行一个特定的程序
  8. 在Spring中使用多个动态缓存
  9. kafka connect_Kafka Connect在MapR上
  10. antlr 语言 库_关于ANTLR的通用库的需求:使用反射来构建元模型