一个关于工厂模式的问题,看似简单实际很头痛。

leonlux 2005-04-14 07:11:31
最近在做一个即时通信软件,服务器和客户端是靠各种具体消息类的对象来进行传递的。各种具体消息类都是继承同一抽象消息类,只有层次结构只有一次,而且各种消息类的接口也很单一,就一个Message.Send()方法(把消息发送出去)。这种结构很适合用工厂模式来解决(简单工厂)。
现在有个很头痛的问题——每种消息类都有自己所承载的信息,比如聊天有文本信息,注册用户有用户信息,用户登录有用户名和密码……以前这些信息都是在构造具体消息类的时候用构造函数传递给它们的。但是现在改成工厂模式的时候却发现无法再将这些信息传进去——因为每种消息类所承载的信息差别很大(比如MessageA要一个String,MessageB要一个User对象,MessageC要两个String等等)不可能用一个或很少几个工厂方法来构造这些消息对象。如果只是把这些对象产生以后将这些信息交给调用者来赋值,则必须涉及到每个消息具体的类,又和使用工厂模式的初衷违背了。
请问大家有没有什么好的方案或技巧解决这个问题?谢谢大家了,这个问题困扰我很长时间了!
...全文
369 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
leonlux 2005-04-25
  • 打赏
  • 举报
回复
呵呵,我现在的做法就和楼上的一样了,只是要牺牲一些类型安全的检查,不过注意一下问题不大。
czlc 2005-04-24
  • 打赏
  • 举报
回复
我想楼主想用工厂模式的原因大概是想:AbstractMessage.Send();而不用涉及到每一个具体Message类。
消息的种类可能多,而且以后还有加,那么用简单工厂就不合适,简单工厂根据参数来确定要实例化的具体产品类,如果要增加的话,那么工厂类和客户端都必须改变。不如使用工厂方法那工厂类结构就可以不变了,至于参数的传入,不知道可不可以在CreatProdutc()里面再针对每个具体的产品,提示用户输入。

拙见,见笑了。
leonlux 2005-04-18
  • 打赏
  • 举报
回复
up一下吧。
li_wdl2005 2005-04-18
  • 打赏
  • 举报
回复
应该用抽象工厂和工厂模式组合来解决这个问题。
czlc 2005-04-16
  • 打赏
  • 举报
回复
顶下,明天来看。
虫虫大叔 2005-04-15
  • 打赏
  • 举报
回复
up
007remember 2005-04-15
  • 打赏
  • 举报
回复

学习ing
帮您顶
leonlux 2005-04-15
  • 打赏
  • 举报
回复
可是我只有一个产品等级结构啊,就是抽象消息类 <|--- 各种具体消息类,用抽象工厂模式不太适合吧?
EverythingMaster 2005-04-15
  • 打赏
  • 举报
回复
学习!
bluesage 2005-04-15
  • 打赏
  • 举报
回复
重要的是如何解决问题,不要套用模式,要根据目的选择、变通模式。
我觉得用抽象工厂,返回一个有Send()方法的接口就可以。具体工厂再返回不同的实现。
leonlux 2005-04-15
  • 打赏
  • 举报
回复
消息的种类可能有点多,而且根据以后的扩展可能引进更多的消息,不知道楼上的仁兄有没有什么好的设计方法?
opencsdn 2005-04-15
  • 打赏
  • 举报
回复
说点看法,仅供参考!
不知道你的消息有几种,如果太多的话,那就要考虑一下这方面的设计本身有没有问题了,如果在一个限量的范围内,可以就用简单工厂模式.重载多种构造函数即可!
sjg008 2005-04-15
  • 打赏
  • 举报
回复
学习
showerXP 2005-04-15
  • 打赏
  • 举报
回复
可是我只有一个产品等级结构啊,就是抽象消息类 <|--- 各种具体消息类,用抽象工厂模式不太适合吧?

讲产品等级结构在细分,使之符合你的要求。
另外,问题不是非常复杂的话,可以考虑用少量重载。不要太考虑“工厂模式的初衷。”了。
lhsxqsc 2005-04-14
  • 打赏
  • 举报
回复
用bridge模式比较好
007remember 2005-04-14
  • 打赏
  • 举报
回复
感觉用抽象工厂模式解决比较好
因为您的项目中涉及到了有关联的类

希望对楼主有帮助
leonlux 2005-04-14
  • 打赏
  • 举报
回复
up一下
leonlux 2005-04-14
  • 打赏
  • 举报
回复
不好意思,刚才不太专心,打错了几个地方,现在改正!


最近在做一个即时通信软件,服务器和客户端的通信是靠各种具体消息类的对象来进行传递的。各种具体消息类都是继承同一抽象消息类,层次结构只有一层,而且各种消息类的接口也很单一,就一个Message.Send()方法(把消息发送出去)。这种结构很适合用工厂模式来解决(简单工厂)。
现在有个很头痛的问题——每种消息类都有自己所承载的信息,比如聊天有文本信息,注册用户有用户信息,用户登录有用户名和密码……以前这些信息都是在构造具体消息类的时候用构造函数传递给它们的。但是现在改成工厂模式的时候却发现无法再将这些信息传进去——因为每种消息类所承载的信息差别很大(比如MessageA要一个String,MessageB要一个User对象,MessageC要两个String等等)不可能用一个或很少几个工厂方法来构造这些消息对象。如果只是把这些对象产生以后将这些信息交给调用者来赋值,则必须涉及到每个消息具体的类,又和使用工厂模式的初衷违背了。
请问大家有没有什么好的方案或技巧解决这个问题?谢谢大家了,这个问题困扰我很长时间了!

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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