proxy和factory

07-06-08 smillton1
最近开始学习设计模式,刚学了factory,现在在看proxy。

想问个问题,factory是否可以看成是proxy的一种应用,工厂所proxy的是产品的构造函数?

不知道这样的理解是不是正确,如果这样的理解有问题,能否解释一下,谢谢各位啦

smillton1
2007-06-11 08:48
没人回答下吗?

banq
2007-06-11 11:38
>factory是否可以看成是proxy的一种应用

不是,factory和proxy都是模式,是同级别的,就象伯伯叔叔都是同一个长辈级别。它们之间可以联合使用,但在抽象层次上,都是一样的,不是谁可以成为谁的应用。

leadyu
2007-06-11 13:17
2种模式属于不同的概念,我的理解是:

工厂主要解决几方面问题:

1)隔离上下文环境对于接口具体实现类的依赖性,工厂往往是基于接口的,比如对new的封装

2)为不同的上下文环境提供不同的对象构造方式,对外提供统一的构造行为,当对于一个对象的创建有不同的逻辑,达到一定复杂程度时又会派生出抽象工厂模式

3)集中对象的构造逻辑,而为什么需要集中管理构造逻辑呢?当对象的构造逻辑在系统设计中处于不稳定的状态,可能发生变化,那么我们就需要隔离上下文对于这样逻辑的依赖性。

这样的思想有一定的共性,那就是,尽量统一类似的逻辑,同时把稳定和易变的逻辑进行分离。应该说很多模式都是为了达到这么一个目的而产生。

当然,具体应用时,模式是灵活的,就拿工厂模式老说,现在越来越多的例子已经不光光应用它于对象的构造上,很多时候已经得到延伸,比如对于对象生命周期的管理。

总的来说,当对象的构造复杂,同时多变,那么我们就要考虑考虑工厂模式,而不是用new。

至于Proxy,GOF的书中所给的定义是:对于已有物件进行代理,从而达到对于物件访问的控制。

那么什么时候我们需要对已有类的功能进行代理呢?

比如说你家局域网封了QQ端口,你使用代理服务器,让你感觉跟正常的使用一样,这是网络访问功能的代理,那么像JAVA的RMI远程调用,通过客户端代理,让你感觉直接在访问远程对象。

,还有就比如说,权限控制,写日志等等。

另外一种情况,我并不是想对于已有类功能的访问进行控制,我可能只是想包装已有功能,做些自己额外的事情,也就是对已有功能的扩展,比如我之前写的监控组件,就是通过代理来进行访问的轨迹跟踪。

那么对于代理的实现,就有很多种,最简单的,就是静态编码,实现对于类的代理包装,还有很多其他方式,比如动态代理,在运行时通过反射机制进行代理,当然随着字节码框架的完善,很多代理的实现方式更加强大,甚至不用定义代理接口,不用改变类的继承关系。

这些是我的理解,看看对你有没帮助

smillton1
2007-06-12 09:03
似乎有些理解了,感觉设计模式中总的思想都有共通的地方,只是有些很细微的差别来达到特有的一些需求。谢谢楼上2位大大的介绍,看来我还需要结合实践,细细体会一下啊。

猜你喜欢