关于工厂模式中具体产品的"小小变异"

waynewang 2009-05-29 04:02:30
简单工厂模式各位都很熟悉了,不再啰嗦

现在的问题是:在具体产品中有几个比较特别,比如在初始化的时候比其他的常规产品多个参数

E.g:
原始的
originalProduct(int i)
变异的(可能是多个变异的产品,不过第一个参数肯定会有)
specialProduct(int i, int j [,...])

在factory生产product时改怎么写呢?

目前的方式是先按照常规的方式来new 然后再判断具体类型来做相应的set参数。

Class product:

public Cmd CmdFactory(int i){
switch(int i){
/*
* 判断i-->new相应的product-->return product(就是个cmd)
*/
}
}

Client :
int j = 0;
int k = 0;
public void process(Cmd cmd){
if(cmd instanceof XXX){
cmd.set(j);
} else (cmd instanceof YYY){
cmd.set(k);
}//可能下面还会有else 的判断
}

目前看着代码就别扭,以后还有可能会出现变异的prodcut,难道到时候还得改Client 增加判断么?

能感觉到肯定有其他更好的办法来替代现有的,但是目前头脑混乱,实在是没头绪,请各位引导一下,不胜感激
...全文
89 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
waynewang 2009-06-01
  • 打赏
  • 举报
回复
多谢qhfu

那个ArgumentObject肯定是需要的,目前看来也只能是这样了。

Thanks
qhfu 2009-05-29
  • 打赏
  • 举报
回复
我的想法是:

public Cmd CmdFactory(ArgumentObject ojb){
//修改都在这里面
}

前提是你觉得 ArgumentObject 确实是需要的
waynewang 2009-05-29
  • 打赏
  • 举报
回复
方法签名最好只改一次,相关的地方也改,不过就改这么一次,以后即使出现新的product也不用再改这个CmdFactory了,这个是我想要达到的目的. :)
waynewang 2009-05-29
  • 打赏
  • 举报
回复
多谢qhfu

刚想了想,在client那段code中执行的方式都一样(无论何种product)。现在也考虑如果改factory那段代码。

Change:

public Cmd CmdFactory(int i,int j) //add parameter for special product


变异的product所需要的parameter都是在这个Class之外传递进来的。

目前仅仅是多了一个参数,如果以后还变化呢,多两个参数呢?

再改这个CmdFactory方法么? 这样就很可能出现“富裕”参数。

改方法体这个是目前能想到的比较好的办法了,变化都在这里,确实好维护,可是方法签名要是再改,那可牵连到其他地方了啊 -_-!
qhfu 2009-05-29
  • 打赏
  • 举报
回复
将变化封装在 product 中去产生 cmd,
每次增加新的cmd, CmdFactory 都是需要变化的, 有一个建议: 把增加新的 cmd 的所有变化都封装在
CmdFactory的地方, 而不要在client中.

可以加一个ArgumentObject类似的对象来表示参数.

没有完全可扩展又不需要修改的模式,只是把变化的地方限制到最小, 只有一个引起变化的地方就容易维护

:)
waynewang 2009-05-29
  • 打赏
  • 举报
回复
谢谢masse的帮助

不过目前项目中是:factory,client,product三者为一体这么个方式,比较那个点-_-!
masse 2009-05-29
  • 打赏
  • 举报
回复
这种情况,我一般会将这个类扩展,
每增加一个product,就增加一个Client。


public final TargetClient extends BaseClient{
@Override
public void process(TargetProduct product){
...
}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧