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(); } } }
相关推荐
"工厂设计模式在Java RMI中的应用研究" 本文主要研究了工厂设计模式在Java RMI中的应用,旨在解决远程对象注册问题。通过对工厂设计模式的应用,实现了远程对象的二次查找,简化了远程对象的注册,节约了服务器的...
工厂模式定义了一个创建对象的接口,但让子类决定实例化哪一个类。JDK中的工厂模式应用包括: - `java.lang.Proxy#newProxyInstance()`: 创建代理实例。 - `java.lang.Class#newInstance()`: 创建类的新实例。 ###...
在Java中,`java.sql.DriverManager`就是工厂模式的一个实例,它负责创建与数据库连接的`Connection`对象,隐藏了具体的实现细节。 2. 单例模式(Singleton Pattern):单例模式确保一个类只有一个实例,并提供一个...
2. **工厂模式**:工厂模式提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这使得系统更易于扩展,因为添加新产品只需要创建新的工厂,而无需修改现有代码。 3. **抽象工厂模式**:在J2EE环境中,当需要...
例如,EJB的容器就使用了工厂模式来创建Enterprise JavaBeans实例。 3. **依赖注入**:Java EE中的Spring框架提供了依赖注入,使得组件之间的依赖关系可以在运行时动态地配置,而不是在代码中硬编码。这增强了代码...
RMI多核MIPS处理器的设计目标之一是低功耗,因此手册会讨论电源管理模式、动态电压频率缩放(DVFS)以及如何编写能效高的代码。 9. **实例和案例研究** 实际的编程示例和案例研究可以帮助开发者更好地理解和应用...
工厂方法模式允许子类决定实例化哪个类,增加了系统的灵活性;抽象工厂模式则关注一组相关的对象创建。 三、观察者模式(Observer) 观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有...
- 工厂模式允许在一个类的实例化过程中延迟具体的类型决策,提高了代码的灵活性和可扩展性。 - 当系统中有多个产品等级结构时,可以使用工厂方法模式,以便在不同的场景下选择不同的产品等级。 - 便于添加新的产品...
2. **工厂模式(Factory)**: 提供一个接口来创建对象,但让子类决定实例化哪一个类。J2EE中的`Servlet`容器就是工厂,负责创建`Servlet`实例。 3. **抽象工厂模式(Abstract Factory)**: 提供一个接口创建一系列...
设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. 设计模式之 Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这...
3. **Factory Method(工厂方法模式)**:如`Collection.iterator()`,允许子类决定实例化哪个类。 4. **Abstract Factory(抽象工厂模式)**:例如`java.sql`包和`UIManager`,提供创建一系列相关或相互依赖对象的...
工厂模式则用于创建bean实例,简化对象的创建过程。 ### EJB设计模式详解 1. **状态管理** - EJB可以是无状态或有状态的。无状态会话bean处理一次性事务,而有状态会话bean则保持与客户端的会话状态。设计模式如...
1. **设计模式**:如单例模式(Singleton),用于确保类只有一个实例;工厂模式(Factory),用于创建对象而不暴露其创建过程;策略模式(Strategy),允许在运行时选择算法;观察者模式(Observer),用于实现对象...
- **工厂模式**:用于创建对象,如EJB的容器使用工厂模式来创建bean实例。 - **策略模式**:允许在运行时选择不同的算法,比如在不同环境下选择不同的数据访问策略。 - **代理模式**:用于实现远程方法调用(RMI...
Java信息管理系统开发模式设计是软件工程领域中一个重要的主题,主要关注如何利用Java技术构建高效、可维护且灵活的信息管理平台。在这个过程中,设计模式起着至关重要的作用,它们是解决常见问题的成熟解决方案,为...
3. **工厂方法模式**:它是工厂模式的进一步扩展,允许子类决定实例化哪个类。 4. **原型模式**:通过复制已有对象来创建新对象,减少了创建新对象的开销。 5. **单例模式**:确保一个类只有一个实例,并提供全局...
- **容错机制**:提供Failsafe、Failsover、Failfast等多种容错模式,确保服务的稳定性和可用性。 - **监控与管理**:Dubbo提供了强大的服务治理平台,包括服务的注册、健康检查、调用链跟踪、性能统计等功能。 5...