关于工厂模式的问题

aha100() ( 一级(初级)) 信誉:100    Blog

首先定义一个概念:什么是代码不影响--1.只加入一个类,其他包括client和server都不用修改代码,而程序运行的结果就会产生相应于那个加入的类的期望输出.
那么工厂模式是否达到了这个目标呢?就以简单工厂模式来说
加入了新类之后:
1.server端从接口或抽象类继承产生一个新的product类,不影响server的其他代码,是可插入性的.
2.如果不使用工厂方法,client端使用新产品的时候必须构造这个新产品类,起码的,必须使用
abstractproduct p1=new newproduct(); 其他的可以保持不变.
3.如果采用工厂方法,代码为,abstractproduct p1=creatot.factory("newproduct");这里的代码不是也要改变吗???????????????
4.两者的区别仅仅是后者用一个统一的界面封装了new操作.
我的问题是:
这两者的区别到底有多大,使用了工厂方法之后到底有什么好处呢?
个人想法:
1.这里的好处首先如上所说是用一个统一的界面封装了new操作,这个界面更好.
2.其次是整个系统的代码可以分离开发,只要遵守一定的接口规范.
3.是否真的不需要修改client的代码了呢?这是个问题.
4.难道仅仅是这么些好处吗?

schumiXsuse() ( 一级(初级)) 信誉:100    Blog

工厂可以控制类实例的数量

sonyejin(这年头和尚都会.NET!)

http://community.csdn.net/Expert/topic/4928/4928140.xml?temp=.7220575

aha100() ( 一级(初级)) 信誉:100    Blog

schumiXsuse() 的有点道理.
不过那基本上变成了单例模式或是多例模式了.

smalllixin(myfox) ( 一级(初级)) 信誉:100    Blog

2.如果不使用工厂方法,client端使用新产品的时候必须构造这个新产品类,起码的,必须使用
abstractproduct p1=new newproduct(); 其他的可以保持不变.
3.如果采用工厂方法,代码为,abstractproduct p1=creatot.factory("newproduct");这里的代码不是也要改变吗???????????????
========================================================
你的思路不太对……
首先,其实工厂模式也不是完全吻合开闭原则的,没有某一个设计模式是完美的。
再说说你的问题,你说

只加入一个类,其他包括client和server都不用修改代码,而程序运行的结果就会产生相应于那个加入的类的期望输出.

这个……  不知道怎么想的。 对这个问题最狭隘的理解至少也应该是加入新的Production的时候不需要对原有的代码进行修改,具体client端使用某个产品是由client端选择的,它既然已经选择创建某个production,那么肯定就会创建相应的产品,输出结果怎么会变?
既然说到了SimpleFactory ,他只是告诉你一种形式和思想,具体能灵活到什么程度就看你了,比如你可以将这个工厂与一个XML文件相对应,这样加入新产品的时候你只需要培植相应的xml文件就可以了

aha100() ( 一级(初级)) 信誉:100    Blog


我说的是我理想中的定义:
发生的情况是有的,不过是相对某一块代码而言,比如一段用抽象类或接口实现的函数代码,这里你只要改变输入的参数,就能得到期望的输出(具体输出由具体类实现的函数决定).
但是这并不意味着就不需要修改代码了,起码的你在参数调用的时候是需要的,于是问题归结为在哪里修改代码.
我对模式的思考是基于如何适应变化的,因为变化必然得是需要修改代码的,只是程度问题,我上面的提问是想说使用了简单工厂模式和仅仅是利用类的多态,两者要改变代码的多少其实是没多大区别的,那这样的好处似乎也就并不是很多了.于是我疑惑于使用简单工厂模式带来的好处到底有多少.
当然仅仅从修改代码的角度并不是周详的,于是我问有没有其他更明显的好处.

sonyejin(这年头和尚都会.NET!) ( 二级(初级)) 信誉:99    Blog

我在前面留的那个贴子里说了,工厂模式相比一般的构造函数,最大的好处在于,它能产生出其所属的类的任何之类的实例,而构造函数只能产生其所属的类的实例,这样更灵活

还有一点就是工厂模式不必每次都产生一个新的对象,它可以返回一个被缓存的对象,而构造函数每次都要产生一个新的对象

aha100() ( 一级(初级)) 信誉:100    Blog

同意sonyejin(这年头和尚都会.NET!),原谅我没仔细看你给的帖子.

"我在前面留的那个贴子里说了,工厂模式相比一般的构造函数,最大的好处在于,它能产生出其所属的类的任何之类的实例,而构造函数只能产生其所属的类的实例,这样更灵活"——这段话我想做这样的理解——其实和我前面说的只是提供了一个更清楚的接口而已。因为在声明一个实例的时候,工厂的界面确实如你所说可以提供“所属的类的任何子类的实例”,只用一个factory(“asdj”)方法,而构造函数只能是一个“所属的类的实例”。这其实就是封装了new方法,因为new是违反依赖倒转的。
很多模式都是为了提供一个更好的界面而已,这个界面使你能依赖更高的抽象。

另“还有一点就是工厂模式不必每次都产生一个新的对象,它可以返回一个被缓存的对象,而构造函数每次都要产生一个新的对象”-----这个应该是单例模式的内容吧,虽然工厂模式和单例模式是可以很容易发生关系的。

aha100() ( 一级(初级)) 信誉:100    Blog

我其实想比较的是两者代码的修改程度问题,但我明白了,其实要考虑更多的是一个界面。而不仅仅是适应变化的代码修改。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值