热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于简单工厂模式的疑问

为什么80%的码农都做不了架构师?这两天在看某本设计模式的书,看到了简单工厂模式。有些许疑惑,请大家围观并帮我答疑解惑。如果发现我的

为什么80%的码农都做不了架构师?>>> hot3.png

这两天在看某本设计模式的书,看到了简单工厂模式。有些许疑惑,请大家围观并帮我答疑解惑。如果发现我的问题很白痴,求轻拍。

书上的简单工厂模式是这样的:

问题背景:实现一个简单的计算器,做加减乘除运算。可以使用简单工厂模式。下图是其UML图:

image

Operator是一个抽象类,有一个getResult方法用来计算左值和右值的结果,其实现在具体类中,AddOperator等。

OperatorFactory是一个工厂类,有一个createOperator方法,其内部实现大致如下:

1 public class OperatorFactory { 2 Operator op = null ; 3 public static Operator createOperator(String s){ 4 switch (s) { 5 case " + " : 6 op = new AddOperator(); 7 break ; 8 case " - " : 9 op = new SubstractOperator(); 10 break ; 11 case " * " : 12 op = new MultiplyOperator(); 13 break ; 14 case " / " : 15 op = new DivideOperator(); 16 break ; 17 } 18 return op; 19 } 20 }

如何调用这个计算器呢?

1 Operator op = OperatorFactory.createOperator( " + " ) 2 op.setLeftValue( 1 ); 3 op.setRightValue( 2 ); 4 double result = op.getResult();

到这里都没问题,我的问题出现在,需求的变化上。如果我们以后增加了一个取余的功能,那么我们需要做的是:

1. 新建一个ModOperator,继承自Operator抽象类,实现getResult方法;

2. 修改OperatorFactory类,在switch分支里面增加一个case,来处理取余的情况。

可是我想我们或许可以不要这个工厂类,我们在系统中直接删除工厂类,其他的保持不变。调用这个计算器的方式是:

1 Operator op = new AddOperator(); 2 op.setLeftValue( 1 ); 3 op.setRightValue( 2 ); 4 double result = op.getResult();

这样之后,如果需要添加一个新的取余方法,那么我们只要:

1. 新建一个ModOperator,继承自Operator抽象类,实现getResult方法;

即可。而不需要修改原来的工厂类(直接没用到这个工厂类)。只需要做一处修改即可。那么,这个工厂类的存在有何意义?

新加了一个工厂类,使得对于系统的变化,代码的更改反而增加了?

此处的封装到底有何意义?


转:https://my.oschina.net/xue777hua/blog/118496



推荐阅读
author-avatar
柯洁豪雅伯育瑋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有