|
锁定老贴子 主题:java比较好的工厂模式变种
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2005-04-06
最近在学习 java中的模式 感觉 java用下面的工厂模式实现有很大优势
因为我没有找到有一样效果的模式的资料 我管它叫 分布式工厂模式 大家感觉如何 [code:1] public class VelocityFactory { private static Logger logger=Logger.getLogger(VelocityFactory.class); private static Map buffer=new HashMap(); /** * */ public VelocityFactory() { super(); // TODO Auto-generated constructor stub } public static VelocityProduct createProduct(String id)throws Exception{ VelocityProduct vp=null; //buffer.containsKey(id); //查找先查找缓冲 Object o=buffer.get(id); if(o!=null){ vp=(VelocityProduct)o; } else{ //可以用super.createProcuct(id)方法或其他工厂方法替代 可以出现类似级联查找的效果 vp=(VelocityProduct)Class.forName(id).newInstance(); buffer.put(id,vp); } //调用产品自身的工厂方法 产生自己 vp=(VelocityProduct)vp.newMe(); return vp; } public static void main(String[] args) throws Exception{ /* VloProductA vp=(VloProductA)createProduct("VloProductA"); System.out.println(vp.str+vp.toString()); vp.str="run"; vp=(VloProductA)createProduct("VloProductA"); System.out.println(vp.str+vp.toString()); */ //测试 String sel="b"; if(sel.equals("a")){ logger.debug("VloProductA with newMe() begin"); int i; for(i=0; i<1000000; i++){ createProduct("VloProductA"); } logger.debug("VloProductA with newMe() "+i+" times end"); } else{ logger.debug("VloProductB with cotr begin"); int i; for(i=0; i<1000000; i++){ Class.forName("VloProductB").newInstance(); } logger.debug("VloProductB with cotr "+i+" times end"); } } } /** * 每个peer(分布式概念中的对等点)都是自己的一个简单工厂 */ abstract class VelocityProduct { //每个peer的工厂方法 public abstract Object newMe()throws Exception; } class VloProductA extends VelocityProduct{ /* (non-Javadoc) * @see java.lang.Object#clone() */ public int init=0; public String str="VloProductA"; //调用了的peer的工厂方法 public Object newMe()throws Exception{ return new VloProductA(); } } class VloProductB extends VelocityProduct{ public int init=0; public String str="VloProductB"; //调了的工厂peer的方法 public Object newMe()throws Exception{ return new VloProductB(); } }[/code:1] 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2005-04-06
如果用Spring等等框架的话,几乎所以的factory模式都没有用了
|
|
| 返回顶楼 | |
|
时间:2005-04-07
楼主:你能解释一下你在createProduct()方法中先后调用vp=(VelocityProduct)Class.forName(id).newInstance()和vp.newMe()方法么,生产了2个vp实例,一个返回,一个cache,这样做为什么?
还有,你的newMe方法,有什么意义呢?需要有一个自己的vp实例创建好了,再调用实例方法newMe,工厂还有必要么?你都让人家用别的办法制造了vp实例了,还有工厂的意义么? to rootsoso:我不认为工厂是什么所谓的反模式,如果说它是反模式也仅仅是在和容器(IOC)比较的情况下。难道所有的应用场合都是组件管理么,都需要容器么,小心过渡设计?面向对象设计中,总有不必用容器的场合吧,很多OO设计场合下,工厂是一种必不可少的优化设计的模式。 |
|
| 返回顶楼 | |
|
时间:2005-04-07
呵呵,想要说它是模式之前,必须给出其适用的场合,你转了一大圈,最后其实还是一个simple factory, 只是在你的VelocityFactory.createProduct()里面有所变化,干吗这里需要使用到reflection,怎么现在都开始很BT的去用reflection才能干活了? 因为reflection只能在java中用啊。
不就是一个factory的注册么? 你就在每个product里面采用static initialize方法向factory注册一次自己就行了。这样c++也好用。 总的来说,楼主“知道什么是工厂,想要实现一个自己的工厂,可却造了一个轮子,还是有缺陷的”。 最后,你的工厂和distribute毫无关系。 |
|
| 返回顶楼 | |
|
时间:2005-04-07
rootsoso 写道 如果用Spring等等框架的话,几乎所以的factory模式都没有用了
把你的话推广一下,ioc容器fans就会说,“有了ioc容器,你的application就不该出现任何的new object()”了。 请问:在spring出现之前,程序都是怎么写的? 过尤不及,时间会让你的想法最终沉淀下来的。 |
|
| 返回顶楼 | |
|
时间:2005-04-07
[quote="eway"]楼主:你能解释一下你在createProduct()方法中先后调用vp=(VelocityProduct)Class.forName(id).newInstance()和vp.newMe()方法么,生产了2个vp实例,一个返回,一个cache,这样做为什么?
还有,你的newMe方法,有什么意义呢?需要有一个自己的vp实例创建好了,再调用实例方法newMe,工厂还有必要么?你都让人家用别的办法制造了vp实例了,还有工厂的意义么? quote] 简单的讲product 自己才是自己真正的工厂 所以我先用factory造出一组工厂(也就是product自己本身的实例)然后再让他反复的造自己 请仔细看一下 只有第一次会用到反射的那句话... newMe可以用clone方法替代 不过效率变差 而且语意 不对了 |
|
| 返回顶楼 | |
|
时间:2005-04-07
引用 呵呵,想要说它是模式之前,必须给出其适用的场合,你转了一大圈,最后其实还是一个simple factory, 只是在你的VelocityFactory.createProduct()里面有所变化,干吗这里需要使用到reflection,怎么现在都开始很BT的去用reflection才能干活了? 因为reflection只能在java中用啊。
不就是一个factory的注册么? 你就在每个product里面采用static initialize方法向factory注册一次自己就行了。这样c++也好用。 谢谢提醒 这个我已经在标题中写明是java中的实现 我的目的是 尽量用simplefactory的这样简单的代码实现 抽象工厂的效果 尽量职能分离 因为我认为 写factory方法的人不应该了解 一个product在初始化的时候到底作了什么...而 用反射是为了执行期得到依赖关系(就是指执行期得到到底是那一个product子类) 但是反射是消耗时间的 所以我用一些空间换这些时间罢了 我想我这样的目的 应该不算违背OO原则吧 呵呵 |
|
| 返回顶楼 | |
|
时间:2005-04-07
rootsoso 写道 如果用Spring等等框架的话,几乎所以的factory模式都没有用了
不过我觉得 spring的核心 包括了一个factory模式的最佳实践 他是 汽车轮子 我现在想要个自行车的轮子.....当然我可以买一个 不过我是个fans 想自己做作看...呵呵 |
|
| 返回顶楼 | |
|
时间:2005-04-07
我所理解的工厂模式是,首先是有于product不想能把自己的创建放在本身new ,而是需要像工厂那样由别人来制造自己。楼主的想法是先由工厂来自己创造一个‘亚当和夏娃’在工厂里注册一下。然后利用依赖注入的原则用工厂来调用product本生的生育能力。这样做工厂就更像是GOD了。我不知道这样做的好处,请楼主说明一下。
|
|
| 返回顶楼 | |
|
时间:2005-04-07
[quote="wfeng007"][quote="eway"]楼主:你能解释一下你在createProduct()方法中先后调用vp=(VelocityProduct)Class.forName(id).newInstance()和vp.newMe()方法么,生产了2个vp实例,一个返回,一个cache,这样做为什么?
还有,你的newMe方法,有什么意义呢?需要有一个自己的vp实例创建好了,再调用实例方法newMe,工厂还有必要么?你都让人家用别的办法制造了vp实例了,还有工厂的意义么? quote] 简单的讲product 自己才是自己真正的工厂 所以我先用factory造出一组工厂(也就是product自己本身的实例)然后再让他反复的造自己 请仔细看一下 只有第一次会用到反射的那句话... newMe可以用clone方法替代 不过效率变差 而且语意 不对了[/quote] 任何一个模式,都有它的应用场合,又它的解决的问题和解决方案,最终的效果。 那么你这个所谓的**工厂模式,是什么样一个设计模式呢,能回答上边的问题否? 依我看,你这段代码一定是在哪个具体应用里抄出来的吧?它顶多就是个变体工厂方法的应用而已。 |
|
| 返回顶楼 | |








