对象推迟实例化

来源:互联网 发布:美工设计助理骗局 编辑:程序博客网 时间:2024/04/30 00:22

        通常在创建一个对象的时候将该对象实例化,但是何时应该对该对象进行实例化,还是有很多的细节需要考虑的,处理的好了,可以节省系统开销,处理的不好,会造成资源的浪费,特别是当有大批量的用户时,如果该用户并不需要使用该对象,但是代码的设计中当用户加载上程序时就开始实例化,必然造成服务器的负担。对于比较大的对象,在使用时再创建它。

        代理模式就是为在不直接操作对象的情况操作该对象提供一种代理方式。

        授权机制:不同级别的用户对同一个对象的使用权限。比如论坛系统中的管理者,普通用户,中级用户、高级用户以及游客。

        linux对不同用户的权限管理(授权机制)是否采用的是代理模式来实现的呢?

        工厂模式也是来实例化一个对象,比如 String str = new String() , 可以用工厂模式来代替new来实例化一个对象,这样做的好处是什么呢?所以当需要实例化(new)一个对象时,需要注意是否可以使用工厂模式来代替实现。当把一个对象的实例化称作“生产一个对象”,那么工厂方法就可以很容易理解了,即由“工厂”来“生产(实例化)一个对象”,我们只要交给工厂一个目标,然后由工厂来“生产”出一个产品(实例化了对象)来。比如工厂有个方法叫 Product create(int whichOne)。

        对于一个需要消耗很大空间(或者资源的)对象来说,比如打开一个含有很大图片的word文档,由于图片很大,加载速度比较慢,但实际上当我们点击打开word文档时,不应该等待很久再显示这个word文档,即不应该等待等待这个图片加载完了才启动word。为了解决这个问题,可以使用代理模式来处理,方法是:把对这个图片的实例化推迟到用户需要时再进行实例化,一方面是因为用户可能打开这个word并不会去操作这个图片对象,一方面是因为即便用户需要操作这个对象,那么仍可以创建一个小的对象来让用户对图片进行一些操作,这种代理也称之为虚拟代理(virtual proxy)。

       类似的例子比如当用手机访问网页的时候,当使用GPRS流量来浏览时,有的浏览器会选择不加载图片,但是图片的占据的位置和大小保留了下来,当用户需要点击后,才可以看到图片,相当于一个超链接一样,这里也使用的是代理的思想,即加载一个网页是,并不会把实例化所有的图片对象,而是在需要的时候(即用户点击的时候)采取实例化这个对象。我们用如下的代码来表达这个过程。


interface Image{displayImage(String url);}class ImageProxy() implements Image{String targetURL;ImageProxy(String url){targetURL = url;}public void displayImage(String url){.../**这里是如何来根据url来下载图片并显示在指定的位置上*/...}}class client(){public static void main(String args[]){Image image = new ImageProxy(url);image.display();}}


       写时拷贝(copy-on-write)使用的是虚拟代理模式来实现的,虚拟代理可以隐藏一个对象存在不同的地址空间的事实。比如java中的String类型,下面举个例子。

String str1 = "a";String str2 = "a";/*********/String str2 = "b";
       在str2的值变成b之前,str1和str2占用的相同的内存空间(即隐藏一个对象存在不同的地址空间的事实),str2更改成b之后,str2和str1的地址就不再相同,这时str2就是另外开辟一段内存空间,即当对象没有被修改时,就不去进行复制,而当其被修改时,再进行复制。这里以str1和str2举例,对于一些比较大和复杂的对象时,减少复制降低了复制的成本。