远程对象工厂设计模式
把一个远程对象注册到rmiregistry注册表,客户就能找到这个远程对象,rmiregistry注册表只能用来注册少量的远程对象。当客户端调用服务器端的远程对象方法时,客户端会向服务器传递参数,服务器端会向客户端传递返回值。RMI规范对参数及返回值的传递做了如下规定:
(1)只有基本类型的数据,远程对象及可序列化的对象才能作为参数或者返回值进行传递。
(2)如果参数或返回值是一个远程对象,那么把它的存根对象传递到接收方。也就是说,接收方得到的是远程对象的存根对象。
(3)如果参数或返回值是可序列化对象,那么直接传递该对象的序列化数据。也就是说,接收方得到的是发送方的可序列化对象的复制品。
(4)如果参数或返回值是基本类型的数据,那么直接传递该数据的序列化数据。也就是说,接收方得到的是发送方的基本类型的数据的复制品。
下面看一段代码,参数或返回值是可序列化对象:
运行服务器程序结果为:
运行客户端程序结果为:
可以看到flight1.equal(flight2):false,参数为可序列化对象时,得到的是远程对象的两个复制品,不相等。equal方法在客户端被重写了,当参数为远程对象时,因为得到是存根对象,flight1.equal(flight2):true,同一个存根对象。