(七)虚代理
  描述:以对对象的客户端对象保持透明的方式,延迟一个对象的创建,直到这个对象被真正需要创建时。虚代理模式能简化这种机制。
  1)虚代理模式是一种节省内存的技术,以便确保对象只有在被用到的时候才得到创建,尤其是这样的对象创建需要大量的内存消耗或者其他资源。
  2)使用虚代理模式后,我们可以创建一个和原有应用程序对象具有同样接口的对象。不同的客户对象可以创建这个虚代理的对象。虚代理的内部有一个应用指向真正的应用程序对象。但是这个代理并不会在一开始自动创建这个应用程序对象。只有当客户调用的一个具体方法需要实际的应用程序对象做出响应的时候,虚代理才会创建这个对象。
  如果实际的对象已经创建了,虚代理把调用转发给这个对象。
  如果实际对象还没被创建,那么虚代理:1.创建实际的对象;2.把这个对象保存在一个内部的引用中;3.把调用转发给这个对象。
  (八)审计代理
  描述:当有需要执行一些附加的操作时,比如在一个对象的方法被调用前后记录日志与计账,这个模式建议把附加功能封装在一个独立的对象中。
  1)当客户程序需要在调用服务提供者对象的方法之前或之后执行一些类似于日志或计数的额外操作时,可以使用计数代理模式。
  2)计数代理模式并不是把这些额外操作的代码直接添加进服务提供者的实现中,而是把它们封装在一个单独的对象里,这个对象叫计数代理。
  3)一个好的设计意味着每个对象只关注于它自身的功能。换句话说,一个理想的对象不该做任何其他无关的事情。
  4)一个计数代理具有和它的服务提供者对象同样的调用接口。客户程序不是直接调用服务提供者对象的方法,而是调用计数代理的方法。代理负责执行如日志或计数的操作,并把方法传递给真正的服务提供者对象。
  (九)聚合强制器
  描述:这个模式建议当一个聚合对象被实例化时,代表组成对象的成员变量也必须被实例化。换句话说,只要一个聚合对象被实例化时它必须被完全实例化。
  1)有时候,一个对象会包含其他的对象作为它的各种成分。这种对象作为其他对象的一个集合称为聚合对象。
  2)聚合强制器模式旨在确认,当一个聚合对象被创建的时候,它必须是被完整创建的。这意味着,当实例化一个聚合对象时,它的那些代表各个部分对象的成员变量也必须被全部初识化。这样一来,一个聚合对象总是被完整创建的,要么压根儿不被创建出来。
  3)有两种聚合关系,我们成为集合体和组合体。不论是哪种情形,聚合对象总是包含若干个成分对象。
  4)在集合体中,聚合对象的各个成分即使离开了聚合对象还是有意义的。而组合体要更加严格一些,组合体的各个成分如果没有聚合对象的存在是没有意义的。
  5)代表成分对象的成员变量可以在创建聚合对象的时候初始化(称为早期初始化)或者在这个变量要被使用的时候再初始化。
  6)在Java里,把一个成员变量声明为final意味着它必须在构造函数里被初始化(读者认为:当然也可以在声明成员变量的时候同时进行初始化,这样不需要在构造函数中初始化了。如果声明了final成员变量却没有初识化,必须在所在类中的构造方法中进行初始化)。如果一个类没有在构造方法里全部初始化它的final成员变量,编译器将会给出错误。
  7)在Java中使用final修饰符对聚合对象中的成员对象进行修饰,可以确保在创建聚合对象后,聚合对象的各个部分对象成员也全部被初始化。这样一来,这个聚合对象算是被完整的创建。
  8)有时,聚合对象内可能包含很多大规模的复杂成分对象。这时候,在创建聚合对象时,把这些成分对象全部初始化可能会非常耗时耗力。在这种情况下,可以使用虚代理模式(Virtual Proxy)为每一个成分对象都设计一个代理(虚代理模式在上面已经提到过了哦,忘了怎么回事,翻翻前面看看)。在创建聚合对象时,只需要先初始化这些代理对象即可。
  (十)显式对象释放
  描述:这个模式建议当一个对象位于作用域以外时,由它绑定的系统资源也必须及时地被释放。
  1)显式对象释放模式是说,当一个对象不再需要的时候,它所使用的外部资源应当被主动、及时地释放掉。
  2)Java语言提供以下两种方式来主动地释放外部资源:finalize() 方法;finally语句。
  3)Java虚拟机(JVM)负责在一个对象离开其作用域之后自动回收该对象占用的内存空间。这个过程称为垃圾回收。
  4)当垃圾回收过程运行的时候,在回收一个对象之前,Java运行时系统会调用对象的finalize()方法。所有必需的释放任何外部系统资源的动作,比如关闭文件或者断开套接字都要实现在这个方法里面。finalize()方法必须声明为: protected void finalize() throws Throwable。
  5)Java的finally代码块,在这里可以实现任何需要的释放外部资源的显式动作。和finalize()方法不同的是,finally代码块不依赖于垃圾回收过程,而是用户工作线程执行的一部分。在finally代码块里执行资源释放会更加可靠,因为这些代码肯定会得到执行,即使发生了未曾预料的运行时异常也不例外。
  (十一)对象缓存器
  描述:这个模式把针对一个对象的方法调用存放在一个库中。当多个客户端对象调用同一方法时,结果被从库中取出返回给客户端对象,而并不去访问实际对象。这么做主要是为了获得一个更快的响应时间。