很久没有在项目中用过简单工厂模式,以前也没用过,基本忘记了简单工厂模式的精髓,这次尝试着在项目中使用,遇到了不少问题。

首先说说自己为什么要用简单工厂:

我想给每个Activity一个Helper对象,来处理activity的业务逻辑,例如请求数据,增删改查操作等等,通过一个工厂产生不同的helper对象。(其实是没有必要这么做的,在每个activity上new出一个helper对象也不麻烦),这是我画的uml图

image

在工厂模式中担任抽象角色的可以使接口,也可以是抽象类,这个例子中就是一个抽象类,WorkPacHelper类里有两个方法executeQuest和getEntityList,这两个方法不是抽象的,他们是所有的WorkPacHelper的子类都要用到的两个方法,所以抽取到父类中,这两个方法主要是供子类中的方法调用。LoginHelper继承了WorkPacHelper,自己添加了特有的方法registerAction,SearchSettingHelper同理。HelperFactory是个简单工厂,负责创建产品。按照我的思路,通过调用工厂的getHelper方法,我就可以得到产品,继而进行调用了。(杯具从此开始)

后来我发现通过工厂的getHelper方法得到的helper对象,只能调用executeQuest和getEntityList方法,这个很好理解,因为工厂得到的实例的引用都是WorkPacHelper,如果不是WorkPacHelper类型的,就违背了面向接口编程的思想,简单工厂模式也就变的没有了意义。怎么解决这个问题呢,我想到了几种办法,但是都不行

第一种:子类中的特有方法例如registerAction作为WorkPacHelper的抽象方法,供子类去实现,这样解决了父类的引用调用子类特有方法的问题,但是这样又造成了一个问题,例如SearchSettingHelper这个子类,他不需要registerAction这个方法,但是他只要继承WorkPacHelper类,就必须全部实现父类的抽象方法(抽象类是不能创建实例的),如果父类中有很多抽象方法,这样就会造成子类中方法的冗余,这事不可取的

第二种:将父类的引用强转成子类的引用,不可取,上面已经说了原因

我再也想不到别的方法来解决这个问题了,我得出一个结论,按照上述的类的设计,根本不适用于简单工厂模式。当我要调用子类Helper的特有方法时,就违背了隐藏具体产品实现的原则。

 

遇到问题了怎么办?google,度娘,能用的全都用上,解决不了问题决不罢休,先看看正确的简单工厂模式实现是怎么样的?

看图:(引用的别人的,写说声谢谢)

image

 

说说他的特点:

1. 具体产品完全实现了抽象产品的方法

就这么一个特点,就使得面向接口编程称为可能

这里我要提出一个疑问:

难道子类就不能添加自己特有的方法和属性了吗,这样是不是限制太大?

再来看看工厂方法模式:

工厂方法模式是在简单工厂模式上的一种抽象,将工厂类抽象成工厂接口或者工厂抽象类,每个具体产品都对应一个具体的工厂,看图

image

奥迪工厂只生产奥迪汽车,奔驰工厂只声场奔驰汽车。自我感觉这样也无法解决我的问题,但是由于我没有用过工厂方法模式,到底怎么样,还不好说。

posted on 2010-12-23 18:56  Android火鸟  阅读(482)  评论(0编辑  收藏  举报