You are on page 1of 61

RMI trong Java

Lp trnh i tng phn tn l mt trong nhng vn nng bng ca cng ngh phn tn phn mm ngy nay. Java l ngn ng i tin phong tronh vic gii quyt vn lp trnh phn tn. Chng ny s gii thiu vi bn khi nim v cch ci t cc i tng phn tn bng k thut RMI trong Java. y l k thut xuyn sut trong ton b kin trc java sau ny.

Cc vn chnh s c cp n:
Khi nim v lp trnh phn tn i tng v k thut RMI. Thit k ng dng phn tn RMI. Chuyn d liu v tham chiu i tng trn mng. Kt ni mng v vn tng la (firewall). Web Services/SOAP mt cng ngh v giao thc mi cho mi trng phn tn.

RMI V LP TRNH PHN TN I TNG Thng thng cc chng trnh ca chng ta c vit di dng th tc hoc hm v vic cc hm gi ln nhau, truyn tham s hay kt qu cho nhau ch xy ra my cc b. K thut RMI (Remote Method Invoke) mang ngha triu gi phng thc t xa l cch thc giao tip gia cc i tng trong Java c m lnh ci t nm trn cc my khc nhau c th triu gi ln nhau. M hnh triu gi cc i tng t xa PC A A2 A1 PC C C1 C3 C2

B1 PC B

GI PHNGTHC T XA V CC VN PHT SINH Vic gi phng thc ca i tng t xa lun phc tp hn gi phng thc cc b. Cc i tng trn hai my khc nhau hot ng trn hai tin trnh khc nhau nn vic tham chiu n bin a ch hon ton khc nhau. Li gi phng thc t xa phi thng qua mng v c th b ngt ngang do mng gp s c. Cc tham s truyn cho i tng xa phi c ng gi v truyn qua mng n vi phng thc thc s.

VAI TR C A CC LP TRUNG GIAN ( STUB V SKELETION ) gii quyt vn trn, i tng trn hai my khc nhau khng gi trc tip m thng qua lp trung gian. Lp ny tn ti c hai pha Client v Server. Lp my Client gi l Stub, lp my Server gi l Skel (Skeletion). V d 1: A1 A2 B1_stub C1_stub Computer A

Computer C C1_skel C1

B1_skel Computer B B1

VAI TR C A CC LP TRUNG GIAN ( STUB V SKELETION ) V d 2: Phng thc A truyn cho phng thc B hai s a,b. Phng thc B s cng hai s a,b cho ra kt qu c v tr v phng thc A. Qu trnh din ra nh sau:

Computer A a,b A

Computer B c B

B_stub

B_skel a,b

a+b=c

CI T NG DNG PHN TN RMI

Cc phng thc s dng trong chng trnh:


exportObject(Object) : nm trong lp UnicastRemoteObject. Phng thc ny lm cho my o Java nhn din c i tng Object. s dng c lp UnicastRemoteObject phi khai bo: import java.rmi.server.*; bind(URLString, Object) thuc lp Naming. - URLString: Chui nh v c dng nh sau: rmi://hostName:port/ObjectName. Trong : rmi: l tn giao thc dng ng k. hostName, port: l a ch IP v s hiu cng ni my ch ni b ng k i tng rmi ang chy. ObjectName: l tn bt k gi nh t cho i tng. Cc chng trnh my khch s da vo tn ny truy tm tham chiu n i tng cn dng. - Object: Tn i tng. Phng thc bind() dng ng k mt tn gi nh cho i tng Object vi b qun l rmi.

CI T NG DNG PHN TN RMI lookup(rmi://hostName:port/ObjectName). Phng thc ny thuc lp Naming. i s l chui nh dng cho bit a ch my ch v tn ng k i tng.

CI T NG DNG PHN TN RMI

Ci t chng trnh cng hai s nguyn.


Calculstor_Stub CalculatorClient Calculstor_Skel Computer 1 Computer 2

RMI

Calculator

Hnh m t triu gi i tng RMI gia trnh khch v i tng ch xa.

CI T NG DNG PHN TN RMI // Calculator.java


nh du cho my o Java bit kh nng giao tip vi cc i tng xa ca Calculator

T lp giao tip Calculator i tng thc s c ci t nh sau: // Calculator.java

CI T NG DNG PHN TN RMI // CalculatorServer.java


Thng bo s hin din ca c cho my o Java

ng k c vi b qun l RMI. Tn gi nh ca c l MyCalculator.

CI T NG DNG PHN TN RMI //CalculatorClient.java


Tm MyCalculator trn a ch localhost

CI T NG DNG PHN TN RMI Din t c ch gi hm t xa ca cc i tng RMI mt cch tng qut.


Computer 1 Computer 2

CalculatorClient 2 4 Calculator 3 rmiregistry 1

CalculatorImpl

CalculatorImpl_Stub

CalculatorImpl_Skel

5 1 i tng ci t cc 5phng thc B g tham chiu registry s tr v tham Khi mt phng thc 3 c i, li v gi hm Naming.bind() l k u n i ng gi s chuyn n lp chi trung gian i tng xa thng qua vi b my registry trm my ch. lp giao tip interface m i tng _Stub. X l tham s ca phng xa cung cp. thmu c n gig n 2 i tng trn my khch i lp _Skel trn my ch. 4 my Dach vo lp giao tip interface i phng ca i tng6trn my ch Lp trung gian _Skel trn s tng trc ht phi g i hm tr c tip yu cu i tng thc thi my khch s gi cc phng th Naming.lookup() truy phng tm tham thc v chuyn tr kt qu c trn my ch. chiu trn n i tng cho t xa theo my khch. tn.

B NG K (REGISTRY), CLASSPATH V CODE BASE

1. B ng k rmiregistry:
C ch lm vic ca trnh khch v trnh ch trn my o java khi ng k v truy xut rmiregistry:
A. My o java chy rmiregistry (127.0.0.1)

C:\j2sdk1.4.0\bin>rmiregistry

2 3 1

Naming.lookup()

Naming.bind()\ Naming.rebind()

C:\RMI>java CalculatorClient 13
C. My o java chy chng trnh khch (127.0.0.1)
4

C:\RMI>java CalculatorServer Exporting Object Regidter Object!


B. My o java chy chng trnh i tng (127.0.0.1)

B NG K (REGISTRY), CLASSPATH V CODE BASE


1

i tng trn my o Java B dng hm Naming.bind() hoc hm Naming.rebind() ng k i vi tng vi chng trnh rmiregistry ang chy trn my o Java A. Chng trnh khch chay trn my o Java C dng hm Naming.lookup() yu cu b my qun l rmiregistry trn my o A tr v tham chiu n i tng. B qun l trn my o A tr v tham chiu n i tng ang tn ti trn my o B. Chng trnh khch chy trn my o C s dng tham chiu do hm Naming.lookup() tr v truy v gi phng thc ca i tng ang chy trn my o b t xa. Ba my o ny c th xem l ba my tnh khc nhau nhng do chy trn cng mt my nn IP Address ging nhau l 127.0.0.1 Thc t m hnh trn mun hot ng trn mng tht th ch c th tch ra lm hai ch khng th tch ra ba, v Java khng cho php rmiregistry chy trn my khc ni i tng rmi ang hot ng.

B NG K (REGISTRY), CLASSPATH V CODE BASE V d:


My tnh vt l 1 (IP: 172.11.13)
2

My tnh vt l 2 (IP: 172.11.12) A. My o Java chy rmiregistry


3 4 1

C. My o Java chy chng trnh khch (CalculatorClient)

B. My o Java chy chng trnh khch (CalculatorImpl)

Lc ny hm ng k vi rmiregistry c gi nh sau: Naming.bind(rmi://172.11.12/Mycalculator,c); V hm try tm i tng t my khch s c gi nh sau: Calculator = new(Calculator) Naming.lookup(rmi://172.11.12/Mycalculator,c);

B NG K (REGISTRY), CLASSPATH V CODE BASE

2. Bin Classpath v ty chn Codebase:


2.1 Classpath:
Khi chy chng trnh, Java da vo bin mi trng CLASSPATH truy tm cc tp tin .class. Nu CLASSPATH ch sai ng dn ti li xy ra: java.lang.ClassNotFoundException: ClassName
V d: Trong th mc C:\RMI cha hai th mc con: C:\RMI\SV gm cc tp tin sau: Calculator.class; CalculatorImpl.class; CalculatorServer.class; CalculatorImpl_Stub.class; CalculatorImpl_Skel.class C:\RMI\CL gm cc tp tin sau: Calculator.class; CalculatorClient.class; CalculatorImpl_Stub.class;

B NG K (REGISTRY), CLASSPATH V CODE BASE Khi Calculatorserver yu cu rmiregistry ng k tn i tng, rmiregistry s i truy tm lp trung gian CalculatorImpl_Stub. Trn my o rmiregistry ang chy nu CLASSPATH khng tr n ng dn C:\RMI\SV th nhn c thng bo li tr v trn my o ni Calculatorserver yu cu ng k i tng: java.lang.ClassNotFoundException:Calculatorimpl_Stub thay i gi tr cho CLASSPATH ta dng lnh: Set Classpath V d: Set Classpath=.;C:\RMI\SV Gi tr mc nh ca Classpath l tr n th mc cha hin hnh. Lc Classpath=.; Khi thay i gi tr cho Classpath mt my o s khng lm nh hng ti Classpath ca my o khc.

B NG K (REGISTRY), CLASSPATH V CODE BASE

2.2 Codebase:
Tht s khi vit chng trnh t pha my khch, lp trnh vin lp trnh vin ch cn n lp giao tip Calculator.class. Lp trung gian CalculatorImpl_Stub.class khng c ngha i vi cc nh pht trin ng dng. N ch cn thit cho c ch RMI ca Java. Chnh v iu ny Java cung cp cho bn cch thc np t ng lp CalculatorImpl_Stub.class t xa thng qua ty chn Codebase khi ng k i tng vi rmiregistry trn my ch. my ch phi h tr thm dch v WebServer chy trn my ni rmiregistry ang chy. Sau chp tp tin CalculatorImpl_Stub.class vo th mc myclass ca trnh ch web server. Khi s dng ty chn Codebase th bin Classpath trn my o ni rmiregistry ang chy khng c tr n cng th mc cha CalculatorImpl_Stub.class. Nu khng rmiregistry s lun u tin ly lp CalculatorImpl_Stub.class t dng dn Classpath m b qua ty chn Codebase. C:\RMI> java Djava.rmi.server.codebase= http:172.16.11.12/myclass/calculatorServer

B NG K (REGISTRY), CLASSPATH V CODE BASE Khi my khch c yu cu rmiregistry tr v tham chiu ca i tng, nu my khch cha c lp Calculatorimpl_Stub.class, rmiregistry s hng dn my khch t ng np lp ny t a ch codebase: http://172.16.11.12/myclass/. C ch np t ng lp trung gian CalculatorImpl_Stub.class xung my khch.
My tnh vt l 1 (IP; 172.16.11.13) 4 My tnh vt l 2 (IP: 172.16.11.13) Web Server 2 3

C. My o java chy chng trnh khch (Calculatorclient) 5

A. My o java chy rmiregistry 1 B. My o java chy i tng

B NG K (REGISTRY), CLASSPATH V CODE BASE 1 Trnh ch CalculatorServer ng k i tng vi remiregistry. CalculatorServer yu cu b qun l rmiregistry truy tm lp CalculatorImpl_Stub.class a ch URL http://172.16.11.12/myclass/. C:\RMI>java Djava.rmi.server.codebase= http://172.16.11.12/myclassValculatorserver
2

Rmiregistry nhn c yu cu ng k i tng n s truy tm lp CalculatorImpl_Stub.class trong lp Classpath. Nu khng thy, rmiregistry s da vo chui URL do trnh CalculatorServer cung cp yu cu Web server tr v lp trung gian ny. Rmiregistry ghi nh li a ch URL ni lp trung gian CalculatorImpl_Stub ang c lu tr . Chng trnh my khch yu cu emiregistry tr v tham chiu ca i tng. Nu phi my khch cha tn ti lp CalculatorImpl_Stub.class b qun l rmiregistry s cho trnh khch bit a ch Url chp lp trung gian ny v.

B NG K (REGISTRY), CLASSPATH V CODE BASE


4

Chng trnh my khch yu cu Web Server cung cp lp trung gian http://172.16.11.12/myclass/CalculatorImpl_Stub.class Trnh khch s dng lp trung gian Calculatorimpl.class v lp giao tip Calculator.class gi cc phng thc ca i tng trn my ch.

2.3 Np tp tin t xa v chnh sch bo mt t pha my khch:


Vi Java tt c cc thao tc kt ni v chp tp tin l t mt my khc v mt my u phi thng qua lp bo v gi l securityManager. to lp bo v ta dng lnh sau: System.setSecurityManager(new RMiSecurityManager()); V d: M ngun ca chng trnh CalculatorClient trong trng hp t ng np lp CalculatorImpl_Stub.class t my ch c vit nh sau:

B NG K (REGISTRY), CLASSPATH V CODE BASE import java.rmi.* public class CalculatorClient{ public static void main(String args[]){ try{ System.setSecuritymanager(new RMISecurityManager()); System.out.println(Finding object); Calculator c = Calculator)Naming.lookup( rmi://172.16.11.12/myCalculator); }catch(Exception e){ System.out.println(e); } }}
Thit lp lp phng v t xa

CHUYN THAM S TRONG LI GI PHNG THC T XA

Chuyn tham s theo tham tr v tham bin:


i vi Java, trn my cc b hu ht cc bin kiu i tng u truyn theo tham chiu trong cc li gi hm. Nha l mt khi bin i tng c truyn vo phng thc nu bn trong phng thc thay i gi tr ca i tng th khi li gi phng thc chm dt gi tr ca i tng cng thay i theo. V d:

CHUYN THAM S TRONG LI GI PHNG THC T XA

CHUYN THAM S TRONG LI GI PHNG THC T XA Khi chy chng trnh value s c gi tr l 13. Tuy nhin cc kiu d kiu n gin nh: int, float, double, char, byte, longli c truyn theo tham tr. Gi tr ca tham s m hm hay phng thc x l ch l bn sao ca bin truyn r ngoi vo. V d:

v d ny kt qu xut ra mn nnh l 12. Tm li, trong java i tng c truyn theo tham chiu cn cc kiu d liu n gin c truyn theo tham tr.

CHUYN THAM S TRONG LI GI PHNG THC T XA Vic truyn tham s qua mng theo c ch RMI li khc vi cch truyn tham s thng thng. Tt c cc kiu d liu n gin nh int,char u c truyn theo tham tr. Tt c cc d liu kiu i tng mun truyn qua mng u buc phi ci t mt trong hai giao tip Remote hoc Serializable. Cc i tng ci t giao tip Remote s c truyn theo tham chiu cn cc i tng c t giao tip Serializable s c tuyn theo tham tr.

CHUYN THAM S TRONG LI GI PHNG THC T XA V d v truyn tham s qua mng s dng giao tip Serializable: M phng v d:

Weight = 12

ball =

anotherBall =

Weight = 12 + 15 = 27

Computer A

Computer B

CHUYN THAM S TRONG LI GI PHNG THC T XA V d v truyn tham s qua mng s dng giao tip Serializable: // Ball.java. import java.io.*; public class Ball implements Serializable{ int weight=0; Xy dng lp public Ball(int w){ Ball.class c weight=w; dng lm tham } s chuyn qua mng gia trnh public int getWeight(){ khch v trnh return weight; ch } public void setWeight(int w){ weight=w; } }

CHUYN THAM S TRONG LI GI PHNG THC T XA //PingServer.java import java.rmi.*; public interface PingServer extends Remote { public Ball ping(Ball b) throws RemoteException; } c t giao tip interface cho i tng trn my ch

CHUYN THAM S TRONG LI GI PHNG THC T XA //PingServerImpl.java import java.rmi.*; Ci t chi tit cho i tng thng qua i lp PingServerImpl

public class PingServerImpl implements PingServer{ public Ball ping(Ball b) throws RemoteException{ System.out.println(Client send a ball objectweight + b.getWeiht()); b.setWeight(b.getWeight()+15); return b; }

CHUYN THAM S TRONG LI GI PHNG THC T XA //Setup.java


import java.rmi.*; import java.rmi.server.*;

Chng trnh Setup ci t i tng PingServerImpl trn my ch

public class Setup { public static void main(String args[])

throws Exception{ PingServer server=new PingServerImpl(); UnicastRemoteObject.exportObject(server);

Naming.bind("rmi://localhost/pingobject",server); System.out.println("Waiting for client request ..."); } }

CHUYN THAM S TRONG LI GI PHNG THC T XA //Client.java


import java.rmi.*;

Chng trnh Client gi phng thc ca i tng pingServer

public class Client { public static void main(String args[]) throws Exception{ Ball ball=new Ball(12); PingServer server=(PingServer)Naming.lookup( "rmi://localhost/pingobject"); System.out.println("Ball weight before send to "+ball.getWeight()); Ball anotherBall=server.ping(ball); System.out.println("Ball weight after send to "+ball.getWeight()); System.out.println("Ball weight return by "+anotherBall.getWeight()); } } server server

server

CHUYN THAM S TRONG LI GI PHNG THC T XA Trong trnh khch Client.java i tng ball trc v sau gi phng thc ping() vn gia nguyn gi tr l 12. Trong khi i tng ball a ln trnh ch c tng gi tr ln 15. Kt qu tr v t trnh ch l mt i tng anotherBall khc vi i tng ball c chuyn i t trnh khch anotherBall c gi tr l 12 + 15 = 27. Nh vy i tng ball c phng thc ping() chuyn i theo tham tr. Nu i tng ball qu ln vic ng gi ton b i tng chuyn i chuyn li trn mng s nh hng n tc thc thi ca chng trnh. By gi chng ta s xy dng chng trnh c th tham chiu v x l trc tip i tng nm trn my khch. Ngha l nu trnh ch c trnh khch truy xut t xa th trnh khch cng c gi t xa bi trnh ch. Bng cch ny trnh ch v trnh khch c th triu gi ln nhau. ( khng nh trc gi ta vn theo c ch th ng trnh khch gi phng thc ca trnh ch).

CHUYN THAM S TRONG LI GI PHNG THC T XA


i tng trn my khch Gi phng thc Gi phng thc i tng trn my ch

C ch gi ngc t xa ca trnh ch n trnh khch thng qua tham chiu gi l c ch callback. V d: //AtClient.java import java.rmi.*; public interface AtClient extends Remote { public void callClientMethod(String message) throws RemoteException; } t t giao tip interface cho i tng AtClient.

CHUYN THAM S TRONG LI GI PHNG THC T XA //AtServer.java import java.rmi.*; t t giao tip interface cho i tng AtServer.

public interface AtServer extends Remote { public void registerClient(AtClient c) throws RemoteException; public void callServerMethod(String message) throws RemoteException; }

Phng thc registerClient() dng tip nhn tham chiu n i tng AtClient. Phng thc callServerMethod() dng cung cp cc dch v cho trnh khch.

CHUYN THAM S TRONG LI GI PHNG THC T XA Ci t chi tit cho i tng AtClient thng qua lp AtClientImpl

//AtClientImpl.java import java.rmi.*;

public class AtClientImpl implements AtClient { public void callClientMethod(String message) throws RemoteException{ System.out.println(message); } }

CHUYN THAM S TRONG LI GI PHNG THC T XA //AtServerImpl.java


import java.rmi.*; public class AtServerImpl implements AtServer { AtClient client; // lu gi tham chiu n i tng trn my khch public void registerClient(AtClient c) throws RemoteException{ client = c; } // c trnh khch triu gi ng k i tng AtClient vi trnh ch public void callServerMethod(String message) throws RemoteException{ System.out.println(message); for (int i=1; i<10; i++){ String msg= "Server response "+ Math.random()*1000;
// Tri u gi phng thc ca i tng chy trn my khch

client.callClientMethod(msg); } } }

CHUYN THAM S TRONG LI GI PHNG THC T XA // Setup.java import java.rmi.*; import java.rmi.server.*; public class Setup { public static void main(String args[]) throws Exception{ AtServer server=new AtServerImpl(); UnicastRemoteObject.exportObject(server); Naming.bind("rmi://localhost/serverobject", server); System.out.println("Waiting for client request ..."); } }

CHUYN THAM S TRONG LI GI PHNG THC T XA //Client.java import java.rmi.*; import java.rmi.server.*; public class Client { public static void main(String args[]) throws Exception{ AtClient client=new AtClientImpl(); UnicastRemoteObject.exportObject(client); AtServer server=(AtServer)Naming.lookup( "rmi://localhost/serverobject"); server.registerClient(client); server.callServerMethod("Client Contact Server"); } }

CHUYN THAM S TRONG LI GI PHNG THC T XA Do java cho php mt i tng c th ci t cng lc nhiu giao tip interface khch nhau nn i tng c th ci t cng lc hai giao tip Serializable v Remote. Khi nu khng dng UnicastRemoteObject.exportObject() ng k i tng cho my o Java th i tng s c truyn theo tham tr, ngc li i tng s c truyn theo tham chiu.

TUN T HA (SERIALZABLE)I TNG Java cung cp cho bn kh nng ghi ton b i tng xung mt tp tin. Sau bn c th em tp tin cha i tng i khp ni nu cn th khi phc i tng v trng thi ban u. i tng trong b nh c th quan h chng cht vi nhau nhng khi c ghi xung tp tin th bt buc phi tri phng i tng theo th t. Trong Java i tng mun c kh nng ghi v lu d liu thnh tp tin phi ci t giao tip java.io.Serializable. Nu i tng cn ghi cha bn trong nhiu i tng con khc th Java ly tt c cc i tng con ghi lun xung a. Di y l v d cho thy kh nng tun t ha ca mt i tng phc hp.

TUN T HA (SERIALZABLE)I TNG


MyObject MyObject

MyObject
MyObject

MyObject
MyObject

MyObject

MyObject

readObject

writeObject

MyObject.ser

TUN T HA (SERIALZABLE)I TNG

Lp i tng lu thnh tp trn a.

TUN T HA (SERIALZABLE)I TNG

To file lu i tng

Khi to i tng trong b nh

// Ghi i tng xung tp tin

TUN T HA (SERIALZABLE)I TNG

M tp tin cha i tng

c i tng t tp tin

TM HIU RMI REGISTRY V CC CCH NG K I TNG Trc gi ta vn s dng b ng k rmiregistry nh mt dch v tm kim. Cc i tng ch mun c trnh khch truy tm c t xa th trc ht phi ng k vi rmiregistry. B mg k ny l mt chng trnh dch v chy hu trng (chng trnh rmiregistry.exe) m cm socket v lng nghe cc yu cu gi n cng mc nh 1099, bn c th ch nh mt cng khc vi cng 1099. V d: C:\j2sdk1.4.0\bin\rmiregistry.exe 9999 lc ny rmiregistry s chy trn cng 9999, v i tng trn my ch s ng k vi rmiregistry theo cch sau: Myobject o = new Myobject(); Naming.bind(rmi://localhost:9999/myObjectname,o); tip n chng trnh trn my khch s yu cu dch v rmiregistry tr v tham chiu n i tng trn my ch: Myobject o = (Myobject)Naming.lookup(rmi://localhost:9999/myObjectna me,o);

TM HIU RIM REGISTRY V CC CCH NG K I TNG Mt dch v ng k c th tip nhn v qun l cng lc nhiu i tng ch khc nhau.
ng k v yu cu rmiregistry Li gi n i tng

My ch rmiregistry Object

ball Chng trnh khch

CalculatorImpl

TM HIU RIM REGISTRY V CC CCH NG K I TNG Trong java cng cho php chng ta ly v danh sch cc i tng m rmiregistry ang nm gi . Di y l chng trnh tm hiu danh sch tn tn cc i tng do rmiregistry nm gi.

//localhost

Kt ni vi b ng k

Ly v danh sch cc i tng

TM HIU RIM REGISTRY V CC CCH NG K I TNG Trong Java cho php bn t to b ng k m khng cn dng n chng trnh rmiregistry.exe. to b ng k v t ng k i tng chng ta gi phng thc tnh createRegistry() ca lp LocateRegistry. V d:

TM HIU RIM REGISTRY V CC CCH NG K I TNG Tuy nhin cch ny ch c th p dng cho mt i tng. Nu mt i tng no to ra b ng k ri th bn khng gi c LocateRegistry.createRegistry() ln th hai trn cng mt cng ca my ch. V d: LocateRegistry.createRegistry(1234); .. Naming.bind(rmi://localhost:1234/myCal,cal);

DNG MT I TNG SN SINH NHIU I TNG ( FACTORYOBJECT ) 1. M hnh xng ch tc i tng: Cho n by gi mi khi xy dng mt i tng ch chng ta u phi t tn cho i tng, ng k tn i tng cho rmiregistry. im bt tin l rmiregistry phi qun l qu nhiu tn i tng v khi vt chng trnh trn my khch chng ta cng phi nh tn ca cc i tng ny. tin li hn java cho php chng ta xy dng mt i tng duy nht v ng k i tng ny vi rmiregistry, nhin v ca n ch dng to ra cc i tng con khc. Mt i tng nh vy trong m hnh hng i tng gi l factory object. Di y l m hnh hot ng ca i tng Factory

DNG MT I TNG SN SINH NHIU I TNG ( FACTORYOBJECT )

Rmiregistry

My ch

1 Factory A B Object 2 3 Chng trnh khch 5 Object B 4 Object A

DNG MT I TNG SN SINH NHIU I TNG ( FACTORYOBJECT ) 1 i tng Factory Object ng k tn mnh vi rmiregistry. 2 Trnh khch mun gi Object A. Trc ht trnh khch lin h vi rmiregistry ly v tham chiu n i tng Factory Object. 3 Sau khi c tham chiu ca i tng Factory Object, trnh khc triu gi i tng Factory Object yu cu to ra v cho php tham chiu n Object A hoc Object B. 4 i tng ch to ra v tr v tham chiu ca Object A, Object B theo yu cu ca trnh khch. 5 Da vo tham chiu do Factory Object tr v trnh khch thc hin li gi n Object A hoc Object B.

DNG MT I TNG SN SINH NHIU I TNG ( FACTORYOBJECT ) 2. Ci t ng dng Factory: Gi s chng ta c i tng FactoryServerImpl dng to ra hai i tng con: NewsImpl dng ly v thng tin v TimerImpl dng ly ngy. Chng ta c m hnh sau: Rmiregistry My ch

1 FactoryServerImpl AB 2 3 Client 5 TimerImpl 4 Newsimpl

DNG MT I TNG SN SINH NHIU I TNG ( FACTORYOBJECT ) //Timer.java

//TimerImpl.java

DNG MT I TNG SN SINH NHIU I TNG ( FACTORYOBJECT ) //News.java

//NewsImpl.java

DNG MT I TNG SN SINH NHIU I TNG ( FACTORYOBJECT ) //FactoryService.java

DNG MT I TNG SN SINH NHIU I TNG ( FACTORYOBJECT ) //FactoryServiceImpl.java

DNG MT I TNG SN SINH NHIU I TNG ( FACTORYOBJECT ) //Setup.java

DNG MT I TNG SN SINH NHIU I TNG ( FACTORYOBJECT ) //Client.java

K THUT GI I TNG XA BNG PHNG PHP NG ( DYNAMIC METHOD INVOKE )

You might also like