请教一个Factory模式的问题

rabbit729 2008-02-01 05:17:13

问题发在“模式及实现”区了,不过发现那的人气不望,接这的人气,希望大家给予解答!详细描述见下面链接
http://topic.csdn.net/u/20080130/17/2d21632a-ba68-4f2d-a9da-006330d5c7f6.html?seed=1842361194
...全文
327 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
magicblue 2008-02-03
  • 打赏
  • 举报
回复
黑格尔的名言可能是被误用最多的哲学观点了,呵呵。

工厂模式其目的不在于创建,其真正的目的在于管理。如果有一个需要很多种不同配置的类,工厂就是很有用的。比如一个类Engine,需要很多配置func1, func2, ..., funcn。这时使用一个工厂Policy来管理这些配置是很方便的:


class PolicyA : public Policy{
public:
func1* create_func1(){
return new func1D();// D means it's a derived class
}
func2* create_func2(){
return new func2D();
}
...
};
class Engine{
Policy* po;
...
public:
foo(){
po->get_funcx();
...
}
};

工厂是多出来的一层抽象,这多出来的一层抽象会带来更大的灵活性。funcx的不同组合有不同的功用,通过对Policy继承来达到组合funcx的目的。这样Engine的配置只需传入相应的PolicyX,而不用每次都去传入很多funcx。另外,如果还有EngineA,B,C...,一旦对于EngineX的配置需要改动,那么只改动相应的Policy,而不必修改每一个传递给EngineA,B,C...的funcx。
总之,工厂模式其目的是在于管理,创建只是表象。一个叫Lemur的语言模型搜索引擎开源项目使用了这个模式来配置搜索引擎的参数。
liuworld 2008-02-03
  • 打赏
  • 举报
回复
还有 我们公司有一个用3种设计模式设计的系统 我不能说是什么
但很明显它很有用 ,而且很好用
liuworld 2008-02-03
  • 打赏
  • 举报
回复
从哲学角度讲存在的既是合理的 taodm一个没用 就把设计模式打死了
我只能说你太强大了
kigy 2008-02-02
  • 打赏
  • 举报
回复
搬个凳子看辩论!也涨涨见识哦~
by the way, 谁有设计模式的电子版啊?最好是英文版的.
还请借本菜鸟一阅,不胜感激啊!
kigysun@gmail.com or kigysun@sohu.com
thanks a lot!
cut9 2008-02-02
  • 打赏
  • 举报
回复
设计模式还是很有用的。taodm 的说法有些道理,但是我认为还是需要设计模式。
C++能解决的,C也能解决,但是C++直接支持面向对象的机制,就带来很多方便。
设计模式被认可之前,也有很多大系统,在编写这些系统时,还没有这么流行的
设计模式总结,可是或多或少它们都用到了设计模式。而且,设计模式本身也是
从以前的发经验中提炼出来的以便复用。可以说,大家注意到它了,以前用它,后来提炼它,
以后还要发展它。
qhfu 2008-02-02
  • 打赏
  • 举报
回复
设计模式中 好像提到的是23个?

个人觉得 设计模式 是一种思想吧,给重构提供方向也给设计提供帮助... 当然重构不一定只有设计模式一个方向.. 更好的函数名,责任更加清楚的类, 减少重用,优化性能. ...

特地去创造一个工厂类,还是写一个函数去完成工厂方法的作用..我觉得 是一种平衡,
感觉在很多代码中还是会看到这种实现的,在基类中写一个函数..
Base * createInstance(String Type){
if (T1)
return new D1();
else if (T2)
return new T2();
....
}

个人感觉 ,这应该是一个factory :)
aspnetwuxueyou3 2008-02-02
  • 打赏
  • 举报
回复
不好意思,我只是开个玩笑,绝对是玩笑。你别生气。
最后一次回复,我不说了。响应您的建议,我好好研究去了。
taodm 2008-02-02
  • 打赏
  • 举报
回复
aspnetwuxueyou3 我想还是你自己应该稳重点,多了解些现在编程界对“模式”的争论。
《设计模式》一书举了26个模式,其中若干模式被很多人认为没意义。
taodm 2008-02-02
  • 打赏
  • 举报
回复
只要创建对象,就总能套到设计模式的若干种厂的单用或联用上。《设计模式》本来就是对已有方法的总结。
把任何一段已经能用的创建对象的代码重构到很“标准”的厂方法,也不带来任何实质的代码质量提高。

另外,我只看到你用了“类似factory pattern”
aspnetwuxueyou3 2008-02-02
  • 打赏
  • 举报
回复
所有的厂方法(包括singleton)都是几乎毫无用处的东西,就不要在上面浪费时间了。
设计模式是为重构提供了目标,而不是解决问题的方法。《设计模式》的前言里有这句话的。

这两句话不矛盾吗?
建议taodm正式为他哗众取宠的豪言道歉
aspnetwuxueyou3 2008-02-02
  • 打赏
  • 举报
回复
taodm你没有看到我说了mfc的serialization是用factory pattern实现的??
身为2星的,不能想我这样一个三角的满嘴跑火车吧。 :)
taodm 2008-02-02
  • 打赏
  • 举报
回复
谁坚持谁举证。你坚持有用,就得证明它。
在《设计模式》一书出来前,大家就从来都没对“制造对象”问题有过困难。在《设计模式》出来后,也还是没人使用这么重型(或者说标准的)厂方法。
甚至,只用C++根本无法实现绝对正确的singleton。
taodm 2008-02-02
  • 打赏
  • 举报
回复
更正,是在《重构》一书,由《设计模式》的作者作的前言里说的。
aspnetwuxueyou3 2008-02-02
  • 打赏
  • 举报
回复
factory method, factory pattern, abstract factory pattern不是一回事。
比如MFC中serialization就是用类似factory pattern实现的。
CObject中定义了DECLARE_DYNAMIC and IMPLEMENT_DYNAMIC, 这就是我上面说的“工厂模式实现应该维护一张表,每个类的名字和对应的创建函数 (可以用map) ”

boost源码我没有看过。
但说factory pattern没用是很不负责任的(个人观点,没有人身攻击的意思:) )
taodm 2008-02-02
  • 打赏
  • 举报
回复
Andrei Alexandrescu只讨论了如何实现某模式,却没有讨论某模式有什么用。你举错人名了。
设计模式是为重构提供了目标,而不是解决问题的方法。《设计模式》的前言里有这句话的。
oowgsoo 2008-02-02
  • 打赏
  • 举报
回复
taodm又拿这种豪言壮语吓唬新人,那么多C++的前辈都仔细探讨过这两种技术,特别是Andrei Alexandrescu的《C++ 设计新思维》,你以为你比人家强多少啊
taodm 2008-02-02
  • 打赏
  • 举报
回复
boost::serialization库。真的和厂方法没啥关系。
aspnetwuxueyou3 2008-02-02
  • 打赏
  • 举报
回复
保存一个对象到文件,然后你再load(再次使用的时候),不用factory方法,有什么更好的方法?
aspnetwuxueyou3 2008-02-02
  • 打赏
  • 举报
回复
我说的是一个过程,先保存,然后再load。
taodm 2008-02-02
  • 打赏
  • 举报
回复
永久化/序列化的问题,怎么和厂方法都扯上了。
加载更多回复(7)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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