`

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
分享到:
评论

相关推荐

    工厂设计模式在Java RMI中的应用研究.pdf

    "工厂设计模式在Java RMI中的应用研究" 本文主要研究了工厂设计模式在Java RMI中的应用,旨在解决远程对象注册问题。通过对工厂设计模式的应用,实现了远程对象的二次查找,简化了远程对象的注册,节约了服务器的...

    JAVA设计模式在JDK中的应用

    工厂模式定义了一个创建对象的接口,但让子类决定实例化哪一个类。JDK中的工厂模式应用包括: - `java.lang.Proxy#newProxyInstance()`: 创建代理实例。 - `java.lang.Class#newInstance()`: 创建类的新实例。 ###...

    探寻Java源码中的设计模式

    在Java中,`java.sql.DriverManager`就是工厂模式的一个实例,它负责创建与数据库连接的`Connection`对象,隐藏了具体的实现细节。 2. 单例模式(Singleton Pattern):单例模式确保一个类只有一个实例,并提供一个...

    JAVA与模式J2EE模式Eclipse开发java企业设计模式.

    2. **工厂模式**:工厂模式提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这使得系统更易于扩展,因为添加新产品只需要创建新的工厂,而无需修改现有代码。 3. **抽象工厂模式**:在J2EE环境中,当需要...

    实用J2EE设计模式编程指南

    例如,EJB的容器就使用了工厂模式来创建Enterprise JavaBeans实例。 3. **依赖注入**:Java EE中的Spring框架提供了依赖注入,使得组件之间的依赖关系可以在运行时动态地配置,而不是在代码中硬编码。这增强了代码...

    rmi-xlr-mips-program-manual

    RMI多核MIPS处理器的设计目标之一是低功耗,因此手册会讨论电源管理模式、动态电压频率缩放(DVFS)以及如何编写能效高的代码。 9. **实例和案例研究** 实际的编程示例和案例研究可以帮助开发者更好地理解和应用...

    JAVA设计模式

    工厂方法模式允许子类决定实例化哪个类,增加了系统的灵活性;抽象工厂模式则关注一组相关的对象创建。 三、观察者模式(Observer) 观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有...

    设计模式面试题

    - 工厂模式允许在一个类的实例化过程中延迟具体的类型决策,提高了代码的灵活性和可扩展性。 - 当系统中有多个产品等级结构时,可以使用工厂方法模式,以便在不同的场景下选择不同的产品等级。 - 便于添加新的产品...

    J2EE设计模式API

    2. **工厂模式(Factory)**: 提供一个接口来创建对象,但让子类决定实例化哪一个类。J2EE中的`Servlet`容器就是工厂,负责创建`Servlet`实例。 3. **抽象工厂模式(Abstract Factory)**: 提供一个接口创建一系列...

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

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

    jdk中设计模式

    3. **Factory Method(工厂方法模式)**:如`Collection.iterator()`,允许子类决定实例化哪个类。 4. **Abstract Factory(抽象工厂模式)**:例如`java.sql`包和`UIManager`,提供创建一系列相关或相互依赖对象的...

    EJB设计模式 中文版

    工厂模式则用于创建bean实例,简化对象的创建过程。 ### EJB设计模式详解 1. **状态管理** - EJB可以是无状态或有状态的。无状态会话bean处理一次性事务,而有状态会话bean则保持与客户端的会话状态。设计模式如...

    使用 Microsoft.NET.的企业解决方案模式

    1. **设计模式**:如单例模式(Singleton),用于确保类只有一个实例;工厂模式(Factory),用于创建对象而不暴露其创建过程;策略模式(Strategy),允许在运行时选择算法;观察者模式(Observer),用于实现对象...

    J2EE与设计模式--

    - **工厂模式**:用于创建对象,如EJB的容器使用工厂模式来创建bean实例。 - **策略模式**:允许在运行时选择不同的算法,比如在不同环境下选择不同的数据访问策略。 - **代理模式**:用于实现远程方法调用(RMI...

    Java信息管理系统开发模式设计 (1).zip

    Java信息管理系统开发模式设计是软件工程领域中一个重要的主题,主要关注如何利用Java技术构建高效、可维护且灵活的信息管理平台。在这个过程中,设计模式起着至关重要的作用,它们是解决常见问题的成熟解决方案,为...

    J2EE的23种设计模式

    3. **工厂方法模式**:它是工厂模式的进一步扩展,允许子类决定实例化哪个类。 4. **原型模式**:通过复制已有对象来创建新对象,减少了创建新对象的开销。 5. **单例模式**:确保一个类只有一个实例,并提供全局...

    Dubbo完整的测试实例

    - **容错机制**:提供Failsafe、Failsover、Failfast等多种容错模式,确保服务的稳定性和可用性。 - **监控与管理**:Dubbo提供了强大的服务治理平台,包括服务的注册、健康检查、调用链跟踪、性能统计等功能。 5...

Global site tag (gtag.js) - Google Analytics