Flyweight模式
享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。
类图
说明
-
Flyweight(轻量级)
按照通常方式编写程序会导致程序变重,所以如果能够共享实例会比较好,而Flyweight角色表示的就是那些实例会被共享的类。
-
FlyweightFactory(轻量级工厂)
FlyweightFactory角色是生成Flyweight角色的工程。在工厂中生成Flyweight角色可以实现共享实例。
-
Client(请求者)
Client角色使用FlyweightFactory角色来生成Flyweight角色。
其他
享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。
Proxy模式
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
类图
说明
-
Subject(主体)
Subject角色定义了使Proxy角色和RealSubject角色之间具有一致性的接口。由于存Subject角色,所以Client角色不必在意它所使用的究竟是Proxy角色还是RealSubject角色。
-
Proxy(代理人)
Proxy角色尽量处理来自Client角色的请求。只有当自己不能处理时,它才会将工作交给RealSubject角色。Proxy角色只有在必要时才会生成RealSubject角色。Proxy角色实现了在Subject角色中定义的接口(API)
-
RealSubject(实际的主体)
RealSubject角色会在Proxy角色无法胜任工作时出场。它与Proxy角色一样,也实现了在Subject角色中定义的接口(API)
-
Client(请求者)
使用Proxy模式的角色,Client角色并不包含在Proxy模式中。
模式的应用
-
远程代理
为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。典型应用场景有WebService,RPC等。
-
虚拟代理
根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。典型案例:浏览器打开一个很大的HTML网页时,网页中有何多的文字和图片,浏览器会先渲染文字部分展示给用户,而图片则是在后台下载完后再逐个渲染。
-
安全代理
用来控制真实对象访问时的权限(功能)。典型案例:经典的三层结构,一般数据层封装了对数据库的接口;业务层只能调用数据层封装的功能接口,不能直接访问数据,不能执行任意的SQL脚本。