Dùng một đối tượng sản sinh nhiều đối tượng (FACTORY OBJECT)
Cho đến bây giờ mỗi khi xây dựng đối tượng chủ chúng ta đều phảI đặt cho đối tượng một tên.Đăng ký tên đối tượng với rmiregistry. Điểm bất tiện đó là rmiregistry phảI quản lý quá nhiều tên đối tượng và bạn với tư cách là nhà phát triển ứng ...
Cho đến bây giờ mỗi khi xây dựng đối tượng chủ chúng ta đều phảI đặt cho đối tượng một tên.Đăng ký tên đối tượng với rmiregistry. Điểm bất tiện đó là rmiregistry phảI quản lý quá nhiều tên đối tượng và bạn với tư cách là nhà phát triển ứng dụng trên máy khách cũng phảI nhớ được tên của đối tượng này. Bạn có thể xây dựng một đối tượng duy nhất và đăng ký đối tượng với rmiregistry. Nhiêm vụ của đối tượng trên chỉ dùng để tạo ra các đối tượng con khác.Một đối tượng như vậy như vậy trong mô hình hướng đối tượng gọi là factory object .
Khi muốn yêu cầu tham chiếu hay triệu gọi một dối tượng con nào đó từ máy chủ ,bạn chỉ cần nhớ tên của đối tượng factory. Sau khi lấy về tham chiếu của đối tượng factory bạn dùng nó để tạo ra các dối tượng con cần thiết
Mô hình hoạt động của đói tượng Factory
Ưng dụng của ta tren máy chủ bao gồm hai đối tượng :News dùng cung cấp thông tin cho máy khách và time dung để cung cấp thời gian hiện hành. Chúng ta không muốn đăng ký hai đối tượng này với rmiregistry mà muốn một đối tượng FactoryServer chịu trách nhiệm đứng trung gian giao tiếp với máy khách để cung cấp đối tượng news và time. Với yêu cầu trên ,chương trình được xây dựng lần lượt theo các bước sau:
Bước 1: Đặc tả giao tiếp và đặt đối tượng timer.
Ví dụ: timer.java
import java.rmi.*;
import java.util.*;
Public interface Timer extends Remote{
Public date getCurrentTime() throws RemoteException;
}
Ví dụ: Timerimpl.java
import java.rmi.*;
import java.util.*;
public class TimerImpl implements Timer{
public date getCurrentTime() throws RemoteException{
System.out.println(Client request time);
Return new date();
}
}
Timer của ta là một đối tượng RMI, cung cấp phương thức getCurrentTime() có thể được gọi từ xa bởi máy khách getCurrentTime() trả về ngày giờ hiện hành trên máy chủ.
Bước 2:Đặc tả giao tiếp và cài đặt đối tượng News.
Ví dụ: News.java
import java.rmi.*;
public interface News extends Remote{
public String gettodayNews() throws RemoteException;
}
Ví dụ: NewsImpl.java.
import java.rmi.*;
public class NewsImpl implements News{
String newslist[]={“Sun released new java version 1.4 and Mobie”,
“Microsoft annuonce Windows.Net 2003”,
“Fujitsu Win Telcomunication Prọect”
};
Static int index=0;
Public String getTodayNews() throws RemoteException{
System.out.println(“client request news”);
Index++;
If(index>2) index=0;
Return newslist[index];
}
}
News của ta là một đối tương RMI, cung cấp phương thức getTodayNews() trae về thông tin cập nhật mới nhất. getTodayNews()lấy thông tin từ mảng newslist[]. Trong ứng dụng thực tế bạn có thể cung cấp thong tin cho trình khách từ cơ sở dữ liệu hay một nguồn tin nào đó. Đối tượng News củ ta như bạn tháy chỉ có khả năng cung cấp 3 tin mà thôi.
Bước 3:Đặc tả giao tiếp và cài đặt dối tượng FacetoryService
ví dụ: FacetoryService.java
import java.rmi.*;
public interface FacetoryService extends Remote{
public News createNews() throws RemoteException;
public Times createTimes() throws RemoteException;
}
Ví dụ: FacetoryServiceImpl.java
import java.rmi.*;
import java.rmi.server.*;
public class FacetoryServiceImpl implements FacetoryService{
News newobject=new NewsImpl();
Timer timerobject=new TimerImpl();
Public FacetoryServiceImpl(){
Try{
UnicastRemoteObject.exportObject(Newsobject);
UnicastRemoteObject.exportObject(Timesobject);
}catch(Exception e){
System.out.println(e);
}
}
Public News createNews() throws RemoteException{
Return newsobject;
}
Public Timer createnews () throws RemoteException {
Return timerobject;
}
}
Trình khách khi giao tiếp với FactoryService sẽ gọi createNews () và createtimer () để tạo ra đối tượng News và Timer. Phương thức khởi dựng của FactoryService có nhiệm vụ kiến tạo để thẻ hiện của hai đối tượng này đồng thời gọi UnicastRemoteObject () để thông báo khả năng triệu gọi từ xa của News và Timer cho máy ảo Java.
Bước 4: Xây dựng trình cài đặt đối tượng và đăng ký FactoryService vói rmiregistry.
Ví dụ: Setup.java
Import java.rmi.*;
Import java.rmi.server.*;
Public class Setup {
Public static void main (String args []) throws Exception{
System.out.println(“Factory object created”);
FactoryService obj=new FactoryServiceImpl ();
UnicastRemoteObject.exportObject(obj);
Naming.bind(“rmi://localhost/myfactory”,obj);
}
}
Trình setup.Java vẫn như thường lệchịu trách nhiệm thể hiện của đối tựơng FactoryService. Đăng ký đối tượng với rmiregistry.
Trình khách muốn gọi News và Timer chỉ cấn nhớ tên đăng ký của FactoryService với miregistry là myfactory. Liên hệ với FactoryService trình khách sễ có được tham chiếu để gọi đến News và Timer. Trình khách Client.java được xây dựng ở bước tiếp theo như sau:
Bước 5: Xây dựng trình khách triệu gọi đối tượng trên máy chủ.
Ví dụ: Client.Java
Import java.rmi.*;
Import java.rmi.server.*;
Public static voidmain (String ags{}) throws Exception{
FactoryService service=(Factoryservce) Naming.lookup(“mi://locahost/myfactory”);
News news=service.createNews();
Timer timer=service.createTimer();
System.out.println(“current”+timer.getcurrentTimer());
System.out.println(“We have new”+news.getTodaynews());
Thead.sleep(1000);
System.out.println(“current”+timer.getcurrentTimer());
System.out.println(“We have new”+news.getTodaynews());
}
}
Nếu như bạn thấy trình khách của ta chỉ việc tham chiếu đến FactoryService bằng hàm:
FactoryServiceservice=(Factoryservice)Name.lookup(“rmi://localhost/myfactory”);
Có đối tượng service trình khách yêu cấud service cung cấp cho mình tham chiếu đến 2 đối tượngcon News và Timer như sau:
News news=service.createNews();
Timer timer=service.createTime();
Việc truy xuất News và Timer diễn ra không có gì khó khăn lắm. Chương tình client của ta gọi getcurrentTime(), geTodaysNew() để lấy về giờ hiện hành và không có tin trên máy chủ.
Bước 6: Biên dịch và chạy chương trình.
Lưu tất cả mã nguồn vào thư mục C:RMIfactory. Chuyển vào thư mục này đánh lệnh biên dịch sau:
C:RMIFactory>javac*.java
Do News, Timer và FactoryService là các đối tượng phân tán nên ta cần phải tạo ra các lớp trung gian Stub và Skel cho chúng. Bạn đánh giá biên dịch tiếp theo sau:
C:RMIFactory>rmic Timerimpl
C:RMIFactory>rmic NewsImpl
C:RMIFactory>rmic FactoryServiceImpl
Khởi động bộ đăng ký rmiregisty
C:RMIFactory>start rmiregisty
Khỏi động trình đăng ký đối tượng FactoryService.
C:RMIFactory>Start java Setup
Chương trình khách:
C:RMIFactory>java clien
Kết quả kết xuất trên máy khách.
Current Mon Jun 27 21:53:56 PDT 2003
We have news: Microft announce Windows 2003
Current Mon Jun 27 21:53:57 PDT 2003
We have news: Fujitsu setup new factory in Vietnam
Kết quả kết xuất trên máy chủ.
Lient request time
Lient request news
Lient request time
Lient request news
Mô hình xưởng chế tác đối tượng là cách thức giao tiếp khá thông dụng mà sau này bạn sẽ thấy Java đưa vào mô hình EJB {EntePrise Java Bean} rất nổi tiếng trong các phiên bản Java 1.2 trở đi. Chúng ta sẽ nghiên cức về EJB trong chương trình sau. Lúc đó bạn sẽ xó dịp tham gia lại kỹ thuật này.