You are on page 1of 26

Posted on Thng Hai 23, 2013by haihth

CHNG V: T MT CHO TI NHIU MU DUY NHT SINGLETON V MU FLYWEIGHT Trong chng ny, chng ta s i qua cc ni dung sau:

S dng mu duy nht Singleton V d v Singleton ng b ha loi b cc vn rc ri trong a lung. Mt cch tt hn x l a lung

S dng mu hng rui flyweight L mt nh t vn c tr lng hu hnh ti MegaGigaco, bn phi x l cc s c v hiu nng h thng. H thng hnh nh ngy cng chm chp hn. Cc lp trnh vin ni: Hmm, bn ni, Ti lu cc bn rng chng ta ang c mt i tng d liu c kch thc kh ln, khong 20Mb Vng, h ni. Cng mt thi im, cc bn s dng bao nhiu i tng ny? Khong 219, cc lp trnh vin ni Tri, vy cc bn s dng 219 i tng 20Mb trong lc chng trnh hot ng? Bn ni. Chng l khng ai thy c vn y ? Khng, h ng thanh ni. Bn ni vi h Cc bn s dng qu nhiu ti nguyn h thng. Cc bn c hng trm i tng to ln m my tnh phi x l. Cc bn c tht s cn tt c chng? Vng h ni.

Ti ngh l khng, bn ni. Ti s sa cha vn ny bng cch s dng mu duy nht Singleton. Chng ny ni v vic kim sot s lng i tng m bn phi to ra trong m ngun ca mnh. C hai mu thit k c bit gip ch cho bn: mu duy nht Singleton v mu hng rui flyweight. Vi mu duy nht Singleton, bn lun m bo rng ch c duy nht mt i tng cho mt lp c th trong sut ng dng. Vi mu hng rui flyweight, bn cng c duy nht mt i tng cho mt lp, nhng khi nhn vo m ca bn, ta c th thy ging nh ang c nhiu i tng vy. y l mt th thu t kho lo. To mt i tng duy nht vi mu duy nht Singleton. Ti bt u vi mu Singleton v x l rc ri m lp trnh vin MegaGigaCo gp phi. H mun chn chc rng ch to duy nht mt i tng cho mt lp c th mc cho ngi khc c c gng to bao nhiu i tng i na. Cc lp trnh vin ang to ra hng trm i tng Database trong m ngun, v rc ri l tng i tng ny c kch thc rt ln. u l gii php? Mu duy nht Singeton l cu tr li.

Mu duy nht Singleton chc chn rng bn c th khi to ch duy nht mt i tng cho mt lp. Nu bn khng s dng mu thit k ny, ton t new nh thng s dng, s to ra lin tip nhiu i tng mi nh sau:

Ghi nh: chc chn rng bn ch c duy nht mt i tng, mc cho ngi khc c hin thc bao nhiu phin bn i na, hy s dng mu duy nht Singleton. Cun sch GoF ni rng, mu Singleton m bo rng mt lp ch c duy nht mt th hin v cung cp mt bin ton cc truy cp n

Bn s dng mu Singleton khi bn mun hn ch vic s dng ti nguyn (thay v vic to khng hn ch s lng i tng) hoc khi bn cn phi x l mt i tng nhy cm, m d liu ca n khng th chia s cho mi th hin, nh registry ca Windows chng hn. Gi : Ngoi i tng bn ghi registry, bn c th s dng mu Singleton khi bn mun hn ch s lng cc th hin c to bi v bn mun chia s d liu ca cc i tng ny. V d nh khi bn c mt i tng ca s window hay hp thoi dialog, cn phi hin th v thay i d liu, bn s khng mun to nhiu th hin ca i tng ny, v bn s b bi ri trong vic phi truy cp d liu ca th hin no. Vic to mt i tng duy nht cng rt quan trng khi bn s dng a lung v khi bn khng mun s ng d liu xy ra. V d bn ang lm vic vi mt i tng c s d liu, v cc th hin khc cng lm vic trn cng c s d liu , vic ng c th gy ra cc vn nghim trng. Ti s tho lun cch lm vic vi mu Singleton v a lung trong chng ny. Bt c khi no bn tht s cn duy nht mt th hin ca mt lp, hy ngh ti mu Singleton ( thay v dng ton t new ). To lp c s d liu Database da trn kiu Singleton Gi l lc bn bt tay vo vit m ngun. Bn s to mt lp tn Database m cc lp trnh vin trong cng ty s s dng. Lp ny c mt hm khi dng n gin, nh m sau:

Bn cn phi thm vo hai hm editRecord, cho php bn chnh sa mt bn ghi, v hm getName, tr v tn gi ca Database.

Ti gi mi vic vn tt p. Bt c khi no bn to mt i tng bng ton t new, mt i tng mi s c to ra. Nu bn to 3 database, bn s c 3 i tng nh sau:

Lm sao bn c th trnh vic to mt i tng mi khi s dng ton t new? y l mt gii php lm cho hm khi dng t ton cc (public) tr thnh cc b (private)

iu ny ngn cn mi ngi s dng hm khi dng, ngoi tr chnh trong lp ny gi ti. Nhng i mt cht, c g khng n y? Ai trn tri t ny li cn c mt hm

khi dng ring t vy? Lm sao bn c th to mt i tng khi bn khng th gi hm khi to n? Bn lm cho hm khi dng tr nn ring t v cch duy nht phn cn li ca th gii khi to i tng l thm vo mt hm to i tng, v gi n khi bn chn chn mun to mt i tng duy nht cho lp ny. Hy xem on m sau:

OK. u tin bn ngn chn vic khi to bng ton t new. V by gi cch duy nht l to mt hm gi vic khi to i tng, thng thng hm ny c tn getInstance (hay createInstance hoc mt ci tn c th nh createDatabase cng c). Ch rng hm ny c gn phm vi cng cng v l mt phng thc tnh bn c th truy cp ti n thng qua tn lp ( v d nh Database.getInstance()) (ND: public v static l hai khi nim trong OOP. Public gip hm c th c s dng t bt k lp khc, static gip ta c th s dng hm trc tip t tn lp, khng cn thng qua mt i tng lp. )

Hm ny s tr v mt i tng Database, nhng hm ch hot ng khi c t nht mt i tng tn ti. V th u tin ta cn kim tra i tng ny, ti gi n l singleObject, xem n tn ti cha? Nu cha, ti s to n. V sau tr gi tr n v cho hm.

Vn c gii quyt. By gi ch c duy nht mt i tng Database tn ti trong cng mt thi im. ( Vn a lung ta s gii quyt trong phn sau ca chng). Vic gi hm getInstance s cho ta mt i tng nh hnh sau:

Khi bn gi getInstance ln na, bn s nhn c cng mt i tng nh ln u. Khng quan tm n vic bn gi bao nhiu ln getInstance, bn lun nhn c cng mt i tng. chnh l cch bn phi lm vi mu singleton. Chy th v d vi mu Singleton Bt u bng vic to mt i tng Database vi tn l products, sau gi hm getName:

Sau bn tip tc to mt i tng Database vi tn l employees, v gi li hm getName kim tra:

Tuy nhin i tng Database c to, v vy trong ln th hai, hm getInstance vn tr v i tng Database c, v kt qu l bn nhn c thng bo:

Qu r rng. Bn nhn c duy nht mt i tng cho d thc hin vic to hai ln. Cch thc bn lm vic nh sau: ngn cn vic khi to bng ton t new, v to mt hm mi to i tng theo bn. chnh l cch mu Singleton hot ng. ng qun vn a lung Hy xem hm getInstance trong v d trn:

C mt l hng tim tng y, tuy nh nhng l mt l hng r rng, l khi lm vic vi a lung. Hy nh rng, bn mun m bo rng ch c duy nht mt i tng Database tn ti. Nhng khi bn c nhiu lung chng trnh chy cng lc, bn s gp rc ri. C th l, hy ch on m kim tra s tn ti ca i tng Database:

Nu c hai lung cng thc hin hm kim tra ny mt lc, hai lung ny u tha iu kin ca hm if ( tc cha c i tng no c to), v iu ny c ngha l c hai lung u to ra mt i tng Database. Lm sao chnh sa ch ny? Mt cch d dng l s dng t kha synchronized ( ng b ) trong Java, xem on m sau:

S dng t kha synchronized s kha vic truy cp vo hm getInstance, trong khi hm getInstance c chy. Bt c lung no mun gi hm getInstance, u phi i hm

ny hot ng xong. S dng k thut ng b ha synchronized l cch d nht thc thi vic n lung trong gi hm, v k thut ny gii quyt c vn a lung. Chy th chng trnh vi gii php ng b ha: Bi v vic gi hm getInstance c ng b ha, bn c gi hm t nhiu lung khc nhau. Xem m sau:

on m cng cho php chy mt tin trnh mi c gng to mi mt i tng DatabaseSynchronized:

Tin trnh mi c gng to mt i tng mi DatabaseSynchronized vi tn employees.

Nhng nh bn c th nhn thy, khi chng trnh thc thi, ch duy nht mt i tng DatabaseSynchronized tn ti. l i tng products.

K t khi bn s dng k thut ng b ha trn hm getInstance, bn khng cn lo lng v vn a lung na. Ch duy nht mt lung c gi hm getInstance. N ngn chn vic to i tng bng mt bc tng an ton, vic kim tra trn cho thy, nu i tng mun to tn ti, hm s khng to, ngc li, s to i tng cho lp. Thot nhn, iu ny tht tuyt vi, ng b ha hm getInstance v gii quyt c vn a lung, bo v m ngun chng li vic xung t khi c nhiu tin trnh cng to mt i tng. Tuy nhin, vn cn mt cu hi, vic ng b ha gii quyt vn , nhng c phi l cch tt nht. Vic ng b ha gy tn ti nguyn h thng, Java buc phi theo di

tng tin trnh cho x l khi no th cho php tin trnh truy cp hm getInstance, khi no th khng cho php. ng b ha hm getInstance lm vic, nhng vi chi ph ng k. C cch no tt hn gii quyt vn ny? Ti u ha vic x l a lung Vn khi bn c gng x l t kha synchronized l on m kim tra vic to i tng s b ph hng bi cc tin trnh khc. Mt cch tt hn lm vic ny l m bo rng on m kim tra khng cn quan trng na. Mi vic th no?Cc lp trnh vin hi trong kinh ngc. Nu bn khng kim tra vic to i tng, lm sao bn c th chc chn l bn khng to thm mt i tng mi? Bn gii thch Bng cch loi b ton b m to i tng ra khi hm getInstance. Ti s vit li m chc chn ch mt i tng c to ra. V i tng s c to ra trc khi bt c lung chng trnh no c th nm bt c n. Hmm, cc lp trnh vin ni Nghe c v n s hot ng tng nh sa: To i tng duy nht m bn mun ngay khi m ngun c np ln u tin vo Java Virtual Machine (my o Java, b my bin dch v thi hnh Java). Khng hm getInstance to i tng na. Ch cho php hm tr v i tng va to. M nh sau:

Tt, gi bn to i tng duy nht ri. Tt c nhng g cn lm l cho hm getInstance tr v i tng ny

Nh cc bn c th thy, tht n gin, i tng singleton c to ra trc khi bt c lung chng trnh no c th nm bt c. Tuyt vi.

Cch lm vic ca gii php x l tin tin trnh Chng trnh trn c hot ng khng? Nh vi gii php ng b ha, bn c th phin bn ny lm vic bng cch to i tng DatabaseThreaded bng cch gi hm getInstance.

V bn c th s dng mt tin trnh khc c gng to ra mt i tng DatabaseThreaded khc.

V khi chng trnh hot ng. Bn thy rng bn ang nhn c cng mt i tng.

y l gii php tt hn vic ng b ha hm getInstance. Khng th to nhiu hn mt i tng, nn s trnh c s xung t gia cc lung chng trnh. Bn g b m ngun ng b ha bng cch a chng ra hi hm getInstance. Ch : Nu bn s dng Java vi phin bn nh hn 1.2, c mt rc ri vi trnh thu dn rc. Nu khng c mt tham chiu vi i tng singleton, trnh thu gom rc s thu gom lun i tng ny. Li ny c sa li trn phin bn 1.2 C mt vn cn ch . Nu bn s dng b np a lp v s dng i tng singleton, bn s gp li. Bi v mi lp s dng mt khng gian tn khc nhau, bn c th i mt vi vic to nhiu i tng singleton. V th khi bn s dng nhiu lp, hy chc chn rng m ngun c kim tra i chiu gia cc lp, m bo rng ch c duy nht mt i tng singleton tn ti trong mt thi im.

Mu hng rui flyweight gip cho mt i tng trng ging nhiu i tng. Mu singleton ni v vic to mt i tng duy nht. C mt mu thit k khc cng hn ch vic to i tng, nhng ln ny n s em n mt cch thc khc trong vic vit m. l mu hng rui flyweight. Mu thit k ny gi l hng rui flyweight nguyn do thay v phi lm vic vi nhiu i tng c lp, to ln, bn gim bt kch thc chng bng vic to mt tp hp cc i tng dng chung nh hn, gi l flyweight m bn c th ci t vo lc thc thi chng trnh chng trng ging nh nhng i tng ln hn. Mi i tng to ln c th tiu tn nhiu ti nguyn h thng, bng cch tch nhng im ging nhau ca cc i tng ny, v da trn vic cu hnh thi gian thc m phng li cc i tng ln, bn lm gim bt gnh nng ln ti nguyn h thng. Bn c th em nhng phn ring bit ra khi m ngun ca nhng i tng to ln v to ra nhng i tng flyweight. Khi lm iu ny, bn chm dt vic s dng nhiu i tng c chung cc c im, v gim xung vic ch s dng mt i tng, c th ci t khi chng trnh thc thi, m phng li c tp hp cc i tng to ln ban u Ghi nh: Sch GoF nh ngha mu flyweight nh sau: S dng vic chia s gip cho vic x l cc i tng ln mt cch hiu qu H cng ni rng: Mt mu flyweight l mt i tng chia s m c th s dng trong ng thi nhiu ng cnh. Mu flyweight hot ng nh mt i tng c lp trong mi thi im. y l nhng g din ra. Bn bt u vi mt tp hp nhiu i tng to ln trong m ngun. Bn g b nhng phn dng chung, ng gi chng vo mt i tng chia s, mt flyweight, i tng ny hot ng nh mt khun mu. i tng khun mu ny c th c ci t vo lc thc thi chng trnh bng cch chuyn cc c im dng chung vo i tng flyweight n xut hin ging nh mt hay nhiu i tng ln ban u. Bn c th thy nh hnh v sau:

T nhng i tng to ln, bn to mt i tng nh hn gi l flyweight (trong v d ny l mt flyweight, ty nhin ty thuc vo ng dng m bn c th c nhiu flyweight), m bn c th ci t vo lc chng trnh hot ng nh hnh sau:

Bt c khi no bn phi x l mt lng ln cc i tng, mu Flyweight s xut hin trong tm tr bn. Nu bn c th tch nhng ni dung ging nhau cn thit t nhng i tng ny, v to mt flyweight, hoc nhiu flyweight, m hot ng ging nhng khun mu, th chnh l cch mu flyweight hot ng

V d rng, cng v mt chuyn gia thit k mu, bn c chn ging dy v mu thit k cho mt lp hc. Chng trnh m bn cn c theo di h s hc vin cho tng hc vin c th l nhng i tng tht s ln. Bn quyt nh n lc tit kim ti nguyn h thng. l cng vic ca mu Flyweight. To mt hc vin to m ngun cho mt i tng hc vin, bn quyt nh ci t n nh mt i tng Flyweight vi tn Student. i tng ny c cu hnh sao cho trng ging nhiu hc vin m bn mun. V vy bn thm vo cc hm thit lp thng tin v tr thng tin, chng hn tn hc vin, m s, v im. Bn cng c th mun so snh hc lc ca cc hc vin vi nhau, nn bn thm mt hm getStanding, c th tr v mi tng quan ca hc lc hc vin v im trung bnh . M nh sau:

Lu rng hm getStanding s tr v s khc bit phn trm im s ca sinh vin so vi im trung bnh. Chy th mu Flyweight

s dng mu flyweight, bn phi lu tr d liu m bn mun cu hnh cho flyweight. Trong trng hp ny bn mun ci t cho i tng Student ging nh mt tp hp cc hc vin c tht, v vy bn c th lu tr d liu sinh vin ( nh tn, m s, im ) bng mt dy nh sau:

so snh hc vin ny vi hc vin khc, bn cn xc nh im trung bnh ( tng im chia cho s sinh vin ), m nh sau:

Trong v d ny, bn cn duy nht mt i tng flyweight Student, bn s truyn gi tr im s trung bnh qua hm khi dng ca Student nh sau:

By gi bn phi ci t i tng flyweight theo mun, thay v phi to tng i tng ring bit cho tng sinh vin mt. Hy xem cch thc vng lp sau thc hin:

Chy m trn v bn nhn c kt qu mong mun. i tng flyweight c cu hnh cho tng hc vin, th hin c tn v xp hng:

Thay v s dng ba i tng y , bn ch cn s dng mt i tng. Cng gn ging mu Singleton, tuy nhin tng ng sau mu Flyweight l kim sot vic to dng i tng, v s lng i tng theo bn mun. X l vn a lung Mu flyweight c s dng kim sot vic to dng i tng, nhng bn lu rng n cng b chung mt vn vi mu Singleton m chng ta nhc ti. Nu m ngun ca bn c s dng a lung, bn c th trnh vic to ra qu nhiu i tng flyweight bng cch tch ri qu trnh to i tng ra khi ton t new nh tng lm vi mu Singleton. Bn c th to i tng flyweight ngay khi lp c np ln u tin, ngn cn vic truy xut hm khi dng bng cch gn cho n mt truy cp cc b, v cho php vic to i tng thng qua hm getInstance.

V d sau, cho thy khi lm vic vi phin bn mi, vic x l a lung c gii quyt

Chy on m trn, kt qu nh sau, bn s nhn c cng mt i tng khi chy cng lc hai lung:

Ch : Vy s dng mu flyweight c hn ch no khng? Vn chnh l bn s mt thm thi gian ci t mt i tng flyweight v nu bn phi ci t bao bc mi th, bn c th s lm gim hiu nng h thng nhiu hn mong i. Mt hn ch na l: bi v bn tch mt lp mu chung ra khi i tng to flyweight, bn phi thm vo mt lp khc trong vic lp trnh, v c th gy ra s kh khn trong vic bo tr v m rng.

You might also like