关于工厂模式的问题
来源:互联网 发布:jenkins源码 官网下载 编辑:程序博客网 时间:2024/04/29 07:45
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
我其实想比较的是两者代码的修改程度问题,但我明白了,其实要考虑更多的是一个界面。而不仅仅是适应变化的代码修改。
- 关于工厂模式的问题
- 关于工厂模式的学习
- 关于工厂模式的了解
- 设计模式--工厂模式(一个关于工厂的故事)
- 关于工厂模式和spring的IOC
- 关于工厂模式的一些反思
- 静态工厂模式&工厂模式&抽象工厂模式&解决的问题
- 关于简单工厂模式
- 关于工厂模式
- 关于工厂模式
- 关于工厂模式
- 关于工厂方法模式
- 关于工厂模式
- 关于工厂模式和建造者模式的理解
- 创建型模式中关于工厂的模式
- 关于工厂模式的作用。为什么要用工厂模式?
- 关于复合模式、策略模式,工厂模式、观察者模式、装饰模式的一个好例子
- 关于简单工厂模式与开闭原则的讨论(1)
- 10000元与9元的日子
- 一个简单的网上报名系统【1】
- 如何设置IIS以便HttpHandler处理相关文件不存在的情形
- WebDA_0.1.0发布了
- JSP一句话后门--2006-08-03
- 关于工厂模式的问题
- 深入探讨MFC消息循环和消息泵
- 一个简单的网上报名系统【2】 [更新][完]
- 关于asp.net2.0中存储过程的调用
- MyOS最近进展
- 微软好员工的十个标准
- Windows延缓写入失败 问题的解决方法
- ASP.NET1.0升级ASP.NET2.0的问题小结
- 硬盘安装FreeBSD