Professional Documents
Culture Documents
Y EJEMPLO EN JAVA.
JNATHAN LVAREZ GONZLEZ.
COD: 108799!88.
"NIVERSIDAD TECNOLGICA DE PEREIRA.
PROGRAMA INGIENER#A DE SISTEMAS Y COMP"TACIN.
IS!$. PROGRAMACIN ORIENTADA A OBJETOS
PEREIRA% MARZO &010.
PATRONES DE DISEO: APLICABILIDAD
Y EJEMPLO EN JAVA.
JNATHAN LVAREZ GONZLEZ.
COD: 108799!88.
MONOGRA'#A:
PATRONES DE DISEO.
INGENIERO:
NGEL A"G"STO AG"DELO ZAPATA.
"NIVERSIDAD TECNOLGICA DE PEREIRA.
PROGRAMA INGIENER#A DE SISTEMAS Y COMP"TACIN.
IS!$. PROGRAMACIN ORIENTADA A OBJETOS
PEREIRA% MARZO &010.
CONTENIDO.
T()* P+,-.*.
1. P*/01.(2 C0(*3-1.*4(2 4
1.1 Mtodo de Fabricacin (Factory
Method)
4
1.2 Singleton. 5
&. P*/01.(2 E2/053/50*4(2 6
2.1 Adaptador (Adapter) 6
2.2 Decorador (Decorator)
$. P*/01.(2 6( C1)710/*)-(./1 !
".1 #$tado$ (State$) !
".2 %b$er&ador (%b$er&er) 11
B-84-1,0*9-*. 1"
PATRONES DE DISEO.
'o$ patrone$ de di$e(o $on )n con*)nto de e$trategia$ o b)ena$ pr+ctica$ ,)e -acilitan el
traba*o a la hora de de$arrollar )na aplicacin en e$pec.-ico. /olo,)ial0ente Los
patrones de diseo son el esqueleto de las soluciones a problemas comunes en el
desarrollo de software.
Se caracteri1an por $er )na agr)pacin de $ol)cione$ a proble0a$ no tri&iale$2
generali1ado$ y aplicable$ para c)al,)ier leng)a*e de progra0acin ,)e traba*e el
paradig0a %rientado a %b*eto$ y ,)e de $ta -or0a $on i0ple0entacione$ re)tili1able$ y
e-ecti&a$2 p)e$ ya $e ha co0probado la $ol)cin de lo$ proble0a$ de -or0a $ati$-actoria.
'o$ patrone$ de di$e(o $e di&iden en tre$ principale$ gr)po$ cla$i-icado$ $eg3n $)$
prop$ito$2 $on conocido$ ade0+$ en honor a $)$ c)atro a)torie$ co0o la banda de lo$
c)atro (4ang o- Fo)r 5 4oF)2 lo$ patrone$ $e cla$i-ican en6
1. 7atrone$ /reacionale$.
2. 7atrone$ #$tr)ct)rale$.
". 7atrone$ de /o0porta0iento.
7or intere$e$ propio$ del c)r$o2 $lo $er+n re$e(ado$ do$ patrone$ de cada cla$e.
1. PATRONES CREACIONALES.
#$t+ndare$ de creacin de cla$e$2 ab$trayendo la -or0a en la ,)e $e crean lo$ ob*eto$.
1.1 '*3/10:* ;'*3/10<=.
#$te patrn $e ba$a en el concepto ,)e )n ob*eto e$peciali1ado $e encarga de in$tanciar
otro$ di-erente$ ob*eto$ y e$to$ proporcionan la inter-a1 del ob*eto recibido.
S)pnga$e )n 0all de co0ida$2 de ello$ e8i$ten de di-erente$ e$peciali1acione$2 co0ida$
t.pica$2 co0ida r+pida2 co0ida$ internacionale$. 'le&ando e$to a la progra0acin
orientada a ob*eto$ obtene0o$ algo c0o e$to6
public abstract class MallComidas {
public abstract String darComida();
}
public class ComidaTipica extends MallComidas {
@Override
public String darComida() {
return "Bandeja paisa.";
}
}
public class Comidaapida extends MallComidas {
public String darComida() {
return "Com!o "am!#rg#esa $ papas %ritas agrandadas.";
}
}
4
Si ,)i$ira0o$ ahora poner en -)nciona0iento n)e$tro pe,)e(o progra0a deber.a0o$
hacer algo co0o e$to6
public class Main {
public static void main( String&' args ) {
MallComidas cena ( null;
))Capric*o es #n dato ingresado por el cliente
if( capric*o.e+#als("comida tipica") ) {
cena ( new ComidaTipica();
}
else if ( capric*o.e+#als("comida rapida") ) {
cena ( new Comidaapida();
}
S$stem.out.println( cena.darComida() );
}
}
'a i0ple0entacin co0o tal no tiene nada errneo. 7roceda0o$ ahora a con$tr)ir n)e$tra
Factor.a y de-inire0o$ de n)e&o n)e$tra cla$e Main.
public class ,actoria {
public static MallComidas crearComida( String capric*o ) {
if( capric*o.e+#als("comida tipica") ) {
return new ComidaTipica();
}
else if ( capric*o.e+#als("comida rapida") ) {
return new Comidaapida();
}
return null;
}
}
public class Main {
public static void main( String&' args ) {
MallComidas cena ( ,actoria.crearComida( "comida tipica" );
S$stem.out.println( cena.darComida() );
}
}
'o ,)e he0o$ logrado ahora e$ )n cdigo 0)cho 0+$ legible2 donde tal co0o $e &e2 )n
patrn Factory elige el ob*eto a in$tanciar y e$conde $te cdigo2 pro0o&iendo el
encap$)la0iento de la$ parte$ 0+$ &ariable$ del $i$te0a9 la cla$e principal: -oco
e*ec)table Main e$ 0)cho 0+$ agradable a &i$ta dada $) notable red)ccin2 l)ego2
35*4>5-(0* 7160+ 106(.*0 31)-6* 2-. .(3(2-6*6 6( 31.13(0 (4 )*44 6( 31)-6* *
-.2/*.3-*0.
1.& I.2/*.3-* ?.-3* ;S-.,4(/1.=.
'a in$tancia 3nica parte de la nece$idad de per0itir )na y $ola )na in$tancia de alg)na
cla$e en e$pec.-ico2 e$to $e logra per0itiendo ,)e $ea la propia cla$e la encargada de
garanti1ar la e8i$tencia de )na 3nica cla$e.
5
'a$ in$tancia$ 3nica$ $on nece$aria$ a 0edida en ,)e )n ob*eto debe controlar el acce$o
a )n 3nico rec)r$o co0o )n archi&o abierto en 0odo e8cl)$i&o2 o bien )n ca$o t.pico
co0o la cone8in a )na ba$e de dato$.
'a i0ple0entacin general de $te patrn $e logra creando la in$tancia de la cla$e por
0edio de )n 0todo de ella 0i$0a y el acce$o a lo$ con$tr)ctore$ de la 0i$0a e$
reg)lada por 0edio de atrib)to$ co0o pri&ado. #n *a&a2 )na i0ple0entacin correcta de
$ingleton e$ la prop)e$ta por ;ill 7)gh6
public class Singleton {
private Singleton() {}
public static Singleton get-nstance() {
return Singleton"older.instance;
}
private static class Singleton"older {
private final static Singleton instance ( new Singleton();
}
}
#8i$ten otra$ &ariante$ de e$ta i0ple0entacin en e$pecial2 por el te0a de la
conc)rrencia2 $i$te0a$ 0)lti<hilo$. 7ero la e$encia del patrn no $e degrada.
&. PATRONES ESTR"CT"RALES.
S) -in e$ b)$car por 0edio del e$t)dio de la$ relacione$ entre lo$ ob*eto$2 la 0e*or -or0a
de con$eg)ir ,)e ca0bio$ en lo$ re,)i$ito$ de la aplicacin no oca$ionen ca0bio$ en la$
relacione$ entre lo$ ob*eto$2 logrado por la$ inter-ace$ ,)e $oportan lo$ ob*eto$.
&.1 A6*7/*610 ;A6*7/(0=.
=n patrn Adaptador tal co0o $) no0bre lo $)giere2 $on )tili1ado$ para adaptar )n ob*eto
a otro2 o bien con&ertirlo.
7or lo reg)lar2 por 0edio de a$ignacione$ $e logra )n $ol)cin2 $in e0bargo2 )n patrn de
adaptacin2 e$ )na -or0a 0)cho 0+$ li0pia y re)tili1able.
Sig)iendo con n)e$tro e*e0plo de 0all de co0ida2 $)pnga$e ,)e ahora po$ee0o$
&ario$ de ello$2 y n)e$tro $i$te0a de i0ple0entacin con$i$te en algo 0+$ ad0ini$trati&o
y general6
public abstract class MallComida {
protected int n#meroTra!ajadores;
protected String especiali.acion;
public abstract int get/#mTra!ajadores();
public abstract String get0speciali.acion();
}
Ahora $)pnga$e ,)e dado n)e$tro 8ito2 co0pra0o$ otra dependencia de co0ida2 la
c)al tiene i0ple0entado $) propio $i$te0a y l)ego n)e$tro$ ob*eto$ (dependencia$) $on
di-erente$ a la ad,)irida6
public class Comederos1#an {
private int n#mero1#ansitos ( 2;
6
private String ric#ra1#an3 ( "4asta -taliana";
private String ric#ra1#an5 ( "6inos C*ilenos";
public int dame0l/#mero1#ansitos() {
return n#mero1#ansitos;
}
public String dame7aic#ra1#an3() {
return ric#ra1#an3;
}
public String dame7aic#ra1#an5() {
return ric#ra1#an5;
}
}
/o0o $e &e2 la$ i0ple0entacione$2 para e$te ca$o $encillo2 &ar.an en $)$ no0bre$ y
n30ero de 0todo$. 'a $ol)cin dr+$tica$ con$i$te en o ca0biar por co0pleto n)e$tra
i0ple0entacin2 o bien la de n)e$tra n)e&a dependencia. 'a $ol)cin elegante con$i$te
en *6*7/*0 4* .5(@* 6(7(.6(.3-* * 4*2 >5( <* /(.()12:
public class Comederos1#an8dapter extends MallComida {
private Comederos1#an comedero1#an;
public Comederos1#an8dapter(Comederos1#an cj) {
comedero1#an ( cj;
}
@Override
public String get0speciali.acion() {
return comedero1#an.dame7aic#ra1#an3() 9 "$ " 9
comedero1#an.getic#ra1#an5();
}
@Override
public int get/#mTra!ajadores() {
return comedero1#an.dame7os/#mero1#ansitos();
}
}
>te$e ,)e he0o$ creado )na cla$e adaptadora ,)e no$ 0oldea o a*)$ta otro ob*eto
externo a n)e$tro$ ob*eto$ conocidos. ')ego2 para obtener n)e$tro n)e&o ob*eto2 e$ tan
$i0ple y elegante co0o e$to6
MallComida comedero1#an ( new Comederos1#an8dapter(new Comederos1#an());
S$stem.out.println( comedero1#an.get0speciali.acion() );
S$stem.out.println( comedero1#an.get/#mTra!ajadores() );
&.& D(310*610(2 ;D(310*/10=.
'o$ decoradore$ $on i0ple0entado$ en -)ncin de e&itar crear 03ltiple$ $)bcla$e$. 7or
e*e0plo $)pnga$e la cla$e /el)lar9 $i $e no$ e$ nece$ario tener )n cel)lar con c+0ara la
$ol)cin $eria crear la $)bcla$e /el)lar/a0ara ,)e herede de /el)lar. De ig)al -or0a $i
$e ,)iere la -)ncionalidad de ?i-i2 $e crear.a la $)bcla$e /el)lar@i-i.
#l proble0a llega c)ando ,)ere0o$ ahora )n cel)lar tanto con ?i-i co0o con c+0ara o
bien 03ltiple$ de $ta$ -)ncionalidade$.