用枚举法实现工厂模型

接着上一篇博客,其实上一篇博客的工厂模型设计的不是很完善,设计的过程中暴露出一些问题。比如下面部分代码(截取上一篇博客)

public class FactoryPatternDemo {public static void main(String[] args) {// 获取工厂实例对象Pensonactory peosonfactory = new Pensonactory();
// 获取 Chinese 的对象,并调用它的 eat 方法Penson penson1 = peosonfactory.getperson("CHINESE");
//调用接口方法penson1.eat();
}
public class Pensonfactory {//使用 getShape 方法获取形状类型的对象public Penson getperson(String type){if(type == null){return null;}if(type.equalsIgnoreCase("CHINESE")){return new Chinese();} else if(type.equalsIgnoreCase("AMERCIA")){return new Amercia();} return null;}
}

分析代码
(1)程序是通过调用函数传递参数后,在工厂类进行实例化对象,这就暴露出一个问题,如果说传递的参数错误就会导致实例化对象为空指向。
(2)传递的参数是对应接口的具体类实现类,只是将字母其大写而已这就暴露出一个问题,将业务逻辑暴露给用户,不利于维护。
(3)代码量累赘,太多if判断语句,代码重复,一旦增加一个类时就要增加一个if判断语句。

解决方法
(1)采用枚举法,将一些参数先设定好防止参数传递错误。
(2)采用java反射机制进行实例化对象减少if语句。

枚举法实现工厂模型

(1)步骤一:创建枚举类

public enum PensonTypeEnum {//包名.类名CHINESE("entity.Chinese"),AMERCIA("entity.Amercia"),private String className;ShapeTypeEnum(String className) {//构造方法this.className = className;}public String getClassName() {return className;}

(2)步骤二:创建接口(跟上一篇博客一样)

(3)步骤三:创建具体实现类(跟上一篇博客一样)

(4)步骤四:创建工厂类

public class Pensonfactory {private Pensonfactory(){}//私有化构造方法public static Shape createpenson(PensonTypeEnum pensonTypeEnum){Penson penson = null;//获取具体类(字符串)String className = pensonTypeEnum.getClassName();try {//获取类Class clazz = Class.forName(className);//实例化对象penson = (Penson)clazz.newInstance();} catch (Exception e) {e.printStackTrace();}return penson;}//测试public static void main(String[] args) {ShapeFactory.createpenson(PensonTypeEnum.CHINESE).eat();ShapeFactory.createpenson(PensonTypeEnum.AMERCIA).eat();         }
}

输出结果:

总结

这种采用枚举法设计模式,相对于前一种方法是有比较好的。既防止参数的传递错误,有不暴露其业务逻辑。还有一点比较重要的是采用Java反射机制来实例化对象减少了if判断语句,增强代码的可读性,减少代码的重复率。

欢迎访问我的个人博客

用枚举法实现工厂模型相关推荐

  1. 【算法设计zxd】第四章蛮力法 1.枚举法 02穷举查找

    目录 蛮力法(brute force): [例4-1]链环数字对  问题分析  计算模型 pair_digital(int n): 代码: [例4-2]解数字迷: 思考题:ACM预测:​ 问题分析 ...

  2. MVC,三层架构,工厂模型,七层

    三层: DAL,BLL,WEB(MODEL,SQLHELPER公共)(BLL层的作用是对数据进行加工和对方法进行组合的例如性别在数据库中是bit类型值只有0和1但是表示层要显示的是男和女,这就要在bl ...

  3. 算法:枚举法---kotlin

    枚举法:效率低,循环所有的情况,找到正确答案 用于解决数学问题,还是很简单的. 比如,奥数里面: 算 法 描 述 题X题=题题题题题题 其中 算法描述题每一个为一个数字,请写出正确的数字. ok,我们 ...

  4. c语言 3个人比饭量大小,OpenJudge计算概论-比饭量【枚举法、信息数字化】

    /*====================================================================== 比饭量 总时间限制: 1000ms 内存限制: 655 ...

  5. 开灯变形问题(枚举法)

    一.问题描述 一排有N盏灯.事先给定每盏灯的初始状态(开着或关着),你的任务是计算出至少要切换多少盏灯的状态(把开着的关掉,或把关着的打开),使得这N盏灯交替地打开和关闭. Input 输入文件中有多 ...

  6. c语言穷举算法 枚举法,c语言枚举法 穷举法 ppt课件

    枚举法 穷举法 笨人之法 把所有可能的情况一一测试 筛选出符合条件的各种结果进行输出 分析 这是个不定方程 三元一次方程组问题 三个变量 两个方程 x y z 1005x 3y z 3 100设公鸡为 ...

  7. 00002-两数之和-leetcode-1.暴力法(枚举法),2.哈希表法,目前更新了枚举法

    两数之和 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. ...

  8. c语言枚举法求满射函数,实变函数论讲义

    第1章 集合与点集 实变函数论作为现代分析数学的基础,其知识结构是建立在集合论之上的.集合论产生于19世纪70年代,由德国数学家康托尔(Cantor)创立,它是整个现代数学的开端及逻辑基础.作为本科教 ...

  9. 字符串匹配——枚举法

    字符串匹配--枚举法 给定主串T和模式串P,返回P在T中首次出现的位置,如果P不存在于T中,返回-1. 这样的问题就是字符串匹配问题,这里先给出枚举法的思想. 设主串T的长度为n,模式串P的长度为m. ...

  10. 什么叫枚举法_四年级:美妙数学之“巧用枚举法”1(0202四)

    美妙数学天天见 每天进步多一点 亲爱的小朋友,你好!我是朱乐平数学名师工作站的赵桂华老师,来自重庆市沙坪坝区西永第一小学. 准备好了吗?我们开始吧! 聪明的小朋友,你愿意和天天一起动脑思考吗? 天天, ...

最新文章

  1. 高通安卓调试LCD几方面总结
  2. 生活感悟 2018-06-13
  3. 位置传感器matlab,永磁同步电机无位置传感器控制matlab仿真【续贴二】
  4. Index of c#
  5. 7-46 新浪微博热门话题 (30 分)(思路+详解+set + map)pta逐个点过的 来呀兄弟们
  6. Rails文件上传file_field报错Encoding::UndefinedConversionError
  7. Java解决空引用_在java中检查空引用的乐观方法
  8. 《Unix网络编程》卷一(简介TCP/IP、基础套接字编程)
  9. Java中正则表达式提取字符串
  10. java启动mysq服务_启动和关闭MySQL服务
  11. java实现验证身份证号是否合法
  12. Clark变换和Park变换在三相系统和单相系统中的应用
  13. SSM和SSH2区别
  14. AgentWeb 更加简洁优秀的webview
  15. MIPI CSI-2笔记(10) -- Low Level Protocol(延迟降低、传输效率增强特性LRTE)
  16. 鲍尔.爱迪斯生前在图论中未完成的问题
  17. GraphPad Prism的八种数据表格式
  18. (web前端网页制作课作业)使用HTML+CSS制作非物质文化遗产专题网页设计与实现
  19. matlab 指纹,一种基于matlab的指纹识别方法
  20. 把笔记本变为无线路由器使用(win7无需软件)

热门文章

  1. Idle进程的切换过程
  2. php用户注册重复_php实现单个用户禁止重复登录,防止同一用户同时登陆
  3. python 修改dataframe列名的几种方法
  4. 连接最大数 详解(C++)
  5. java equals 的区别_Java中equals和==的区别
  6. OpenCV图像处理基础操作(3)
  7. html 中ip控件,WEB高性能开发(10) - 疯狂的HTML压缩
  8. jdbc连接mysql数据库 工作流程_jdbc连接数据库流程图
  9. cas 单点登录_5分钟明了单点登录SSO、OAuth、LDAP、CAS的流程与应用
  10. python flask是什么_python flask是什么