`

rmi工厂模式实例

阅读更多

rmi编写java分布式系统时,采用工厂模式的使用示例,参考孙卫琴的《java网络编程精解》,比较简单,仅供日后备忘。

 

类图:



 

 

 

远程接口

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IFlight extends Remote{
	
	public String getFlightNumber() throws RemoteException;
	
	
	public String getOrigin() throws RemoteException;

	public void setOrigin(String origin) throws RemoteException;

	public String getDestination() throws RemoteException;

	public void setDestination(String destination) throws RemoteException;

	public void setFlightNumber(String flightNumber) throws RemoteException;
	
}

 

远程对象:

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import org.gogo.protocol.rmi.IFlight;

public class FlightImpl extends UnicastRemoteObject implements IFlight{
	protected String flightNumber;
	protected String origin;
	protected String destination;
		
	public FlightImpl(String flightNumber, String origin, String destination) throws RemoteException{
		this.flightNumber = flightNumber;
		this.origin = origin;
		this.destination = destination;
	}
	
	public String getFlightNumber() throws RemoteException {
		System.out.println("~~~~ 调用 getFlightNumber, 返回 "+ flightNumber);
		return this.flightNumber;
	}
	

	public String getOrigin() {
		return origin;
	}

	public void setOrigin(String origin) {
		this.origin = origin;
	}

	public String getDestination() {
		return destination;
	}

	public void setDestination(String destination) {
		this.destination = destination;
	}

	public void setFlightNumber(String flightNumber) {
		this.flightNumber = flightNumber;
	}	
	
}

 

 

远程接口(工厂):

import java.rmi.Remote;
import java.rmi.RemoteException;

import org.gogo.protocol.rmi.IFlight;

public interface IFlightFactory extends Remote {
	
	public IFlight getFlight(String flightNumber) throws RemoteException;
}

 

远程对象(工厂):

public class FlightFactoryImpl extends UnicastRemoteObject implements IFlightFactory{
	protected Hashtable<String, IFlight> flights;
	
	public FlightFactoryImpl() throws RemoteException {
		flights = new Hashtable<String, IFlight>();
	}
	
	public IFlight getFlight(String flightNumber) throws RemoteException {
		IFlight flight = flights.get(flightNumber);
		if(flight == null)
			flight = new FlightImpl(flightNumber, null, null);
		flights.put(flightNumber, flight);
		
		return flight;
	}
	
}

 

rmi server:

import java.rmi.registry.LocateRegistry;

import javax.naming.Context;
import javax.naming.InitialContext;

import org.gogo.protocol.rmi.factory.FlightFactoryImpl;
import org.gogo.protocol.rmi.factory.IFlightFactory;

public class SimpleServer {
	
	public static void main(String[] args) throws Exception {
		IFlightFactory factory = new FlightFactoryImpl();
		LocateRegistry.createRegistry(1099);
		
		Context ctx = new InitialContext();
		ctx.rebind("rmi://localhost:1099/FlightFactory", factory);
		System.out.println("~~~~ 服务器注册了一个FlightFactory对象");
	}
}

 

rmi client:

import javax.naming.Context;
import javax.naming.InitialContext;

import org.gogo.protocol.rmi.IFlight;
import org.gogo.protocol.rmi.factory.IFlightFactory;

public class SimpleClient {
	
	public static void main(String[] args){
		String url = "rmi://localhost:1099/";
		
		try{
			Context ctx = new InitialContext();
			Object obj = ctx.lookup(url +"FlightFactory");
			if(obj == null)
				return;
			
			IFlightFactory remoteObjFactory = (IFlightFactory)obj;
			if(remoteObjFactory == null)
				return;
			
			IFlight flight1 = remoteObjFactory.getFlight("795");
			flight1.setOrigin("beijing");
			flight1.setDestination("huhuhaote");
			
			IFlight flight2 = remoteObjFactory.getFlight("795");
			System.out.println("~~~~ flightNumber : "+ flight2.getFlightNumber());
			System.out.println("~~~~ from ["+ flight2.getOrigin() +"[ to ["+ flight2.getDestination() +"]");
			
			System.out.println("~~~~ flight1是 ["+ flight1.getClass() +"]的实例");
			System.out.println("~~~~ flight2是 ["+ flight2.getClass() +"]的实例");
			
			System.out.println("~~~~ flight1==flight2 : "+ (flight1==flight2));
			System.out.println("~~~~ flight1.equals(flight2) : "+ (flight1.equals(flight2)));
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

 

 

  • 大小: 10.1 KB
分享到:
评论

相关推荐

    二十三种设计模式【PDF版】

    设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. 设计模式之 Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这...

    java 面试题 总结

    Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...

    超级有影响力霸气的Java面试题大全文档

     SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。...

    J2EE应用开发详解

    218 12.1.3 RMI的优点 219 12.2 一个RMI的简单实例 219 12.3 小结 226 第13章 Web服务概论 227 13.1 SOA简介 227 13.2 Web服务简介 229 13.3 Web服务的核心技术 230 13.3.1 SOAP 232 13.3.2 WSDL 235 13.3.3 UDDI ...

    Quartz-Job-Scheduling-Framework-中文版-V0.9.1.zip

    内容提要:建立 Hello Quartz 工程,并创建一个 Quartz Job 类 ScanDirectoryJob. 第三章. Hello Quartz (第二部分) 内容提要:创建一个 Quartz Scheduler,关联上一个 Quartz Trigger 以编程方式调度前面编写的 ...

    Java核心技术II(第8版)

    11.7 字节码工程 11.7.1 载入时修改字节码 第十二章 本地方法 12.1 从Java程序中调用C函数 12.2 数值参数与返回值 12.2.1 用printf格式化数字 12.3 字符串参数 12.4 访问对象域 12.4.1 访问实例域 12.4.2 访问静态...

    Java并发编程(学习笔记).xmind

    远程方法调用(RMI) 正确协同多个对象中的共享状态 正确协同远程对象本身状态的访问 Swing和AWT 事件处理器与访问共享状态的其他代码都要采取线程安全的方式实现 框架通过在框架线程中调用...

    java面试题

    72.9. action是单实例还是多实例,为什么? 73 72.10. Struts的validate框架是如何验证的? 74 72.11. dispatchAction是用什么技术实现的? 74 72.12. struts2.0的mvc模式?与struts1.0的区别? 74 72.13. struts1.2...

    Spring中文帮助文档

    11.1.1. 选择一种工作模式 11.1.2. Spring JDBC包结构 11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 ...

    Spring API

    11.1.1. 选择一种工作模式 11.1.2. Spring JDBC包结构 11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 ...

    Spring攻略(第二版 中文高清版).part2

    2.2 调用一个实例工厂方法创建Bean 58 2.2.1 问题 58 2.2.2 解决方案 59 2.2.3 工作原理 59 2.3 从静态字段中声明Bean 60 2.3.1 问题 60 2.3.2 解决方案 60 2.3.3 工作原理 61 2.4 从对象属性中...

    Spring攻略(第二版 中文高清版).part1

    2.2 调用一个实例工厂方法创建Bean 58 2.2.1 问题 58 2.2.2 解决方案 59 2.2.3 工作原理 59 2.3 从静态字段中声明Bean 60 2.3.1 问题 60 2.3.2 解决方案 60 2.3.3 工作原理 61 2.4 从对象属性中...

Global site tag (gtag.js) - Google Analytics