论坛首页 Java版

java比较好的工厂模式变种

浏览 11978 次
精华帖 (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]
   
时间:2005-04-06
如果用Spring等等框架的话,几乎所以的factory模式都没有用了
   
0 请登录后投票
时间:2005-04-07
楼主:你能解释一下你在createProduct()方法中先后调用vp=(VelocityProduct)Class.forName(id).newInstance()和vp.newMe()方法么,生产了2个vp实例,一个返回,一个cache,这样做为什么?
还有,你的newMe方法,有什么意义呢?需要有一个自己的vp实例创建好了,再调用实例方法newMe,工厂还有必要么?你都让人家用别的办法制造了vp实例了,还有工厂的意义么?

to rootsoso:我不认为工厂是什么所谓的反模式,如果说它是反模式也仅仅是在和容器(IOC)比较的情况下。难道所有的应用场合都是组件管理么,都需要容器么,小心过渡设计?面向对象设计中,总有不必用容器的场合吧,很多OO设计场合下,工厂是一种必不可少的优化设计的模式。
   
0 请登录后投票
时间:2005-04-07
呵呵,想要说它是模式之前,必须给出其适用的场合,你转了一大圈,最后其实还是一个simple factory, 只是在你的VelocityFactory.createProduct()里面有所变化,干吗这里需要使用到reflection,怎么现在都开始很BT的去用reflection才能干活了? 因为reflection只能在java中用啊。

不就是一个factory的注册么? 你就在每个product里面采用static initialize方法向factory注册一次自己就行了。这样c++也好用。


总的来说,楼主“知道什么是工厂,想要实现一个自己的工厂,可却造了一个轮子,还是有缺陷的”。

最后,你的工厂和distribute毫无关系。
   
0 请登录后投票
时间:2005-04-07
rootsoso 写道
如果用Spring等等框架的话,几乎所以的factory模式都没有用了



把你的话推广一下,ioc容器fans就会说,“有了ioc容器,你的application就不该出现任何的new object()”了。

请问:在spring出现之前,程序都是怎么写的? 过尤不及,时间会让你的想法最终沉淀下来的。
   
0 请登录后投票
时间: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方法替代 不过效率变差 而且语意 不对了
   
0 请登录后投票
时间:2005-04-07
引用
呵呵,想要说它是模式之前,必须给出其适用的场合,你转了一大圈,最后其实还是一个simple factory, 只是在你的VelocityFactory.createProduct()里面有所变化,干吗这里需要使用到reflection,怎么现在都开始很BT的去用reflection才能干活了? 因为reflection只能在java中用啊。

不就是一个factory的注册么? 你就在每个product里面采用static initialize方法向factory注册一次自己就行了。这样c++也好用。

谢谢提醒
这个我已经在标题中写明是java中的实现
我的目的是 尽量用simplefactory的这样简单的代码实现 抽象工厂的效果
尽量职能分离 因为我认为 写factory方法的人不应该了解 一个product在初始化的时候到底作了什么...而 用反射是为了执行期得到依赖关系(就是指执行期得到到底是那一个product子类) 但是反射是消耗时间的 所以我用一些空间换这些时间罢了
我想我这样的目的 应该不算违背OO原则吧 呵呵
   
0 请登录后投票
时间:2005-04-07
rootsoso 写道
如果用Spring等等框架的话,几乎所以的factory模式都没有用了

不过我觉得 spring的核心 包括了一个factory模式的最佳实践
他是 汽车轮子 我现在想要个自行车的轮子.....当然我可以买一个 不过我是个fans 想自己做作看...呵呵
   
0 请登录后投票
时间:2005-04-07
我所理解的工厂模式是,首先是有于product不想能把自己的创建放在本身new ,而是需要像工厂那样由别人来制造自己。楼主的想法是先由工厂来自己创造一个‘亚当和夏娃’在工厂里注册一下。然后利用依赖注入的原则用工厂来调用product本生的生育能力。这样做工厂就更像是GOD了。我不知道这样做的好处,请楼主说明一下。
   
0 请登录后投票
时间: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]

任何一个模式,都有它的应用场合,又它的解决的问题和解决方案,最终的效果。
那么你这个所谓的**工厂模式,是什么样一个设计模式呢,能回答上边的问题否?
依我看,你这段代码一定是在哪个具体应用里抄出来的吧?它顶多就是个变体工厂方法的应用而已。
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐