DesignPatterns (FactoryMethod,Prototype,Singleton) JoãoAntónioPaz LuísMiguelClaro AlbertoManuelGomes N.º12812 N.º12817 N.º12818
FACTORYMETHOD Padrãoquedefineumainterfaceparacriaçãodeobjectos,masdeixaassubclassesdecidirque classedeveminstanciar.ouseja,opadrãofactorymethodpermiteainstanciaçãodaclasse sejadiferentenassuassubclasses. EstruturadopadrãoFactoryMethod SuponhamosquetemosumaclasseabstractaLivrariaquetemLivros.Possuiométodo CriarLivro(),queretornaumnovoLivro.SecriarmosumasubclassedeLivrariaquedefinao métodocriarlivro(),estemétododeveretornarumasubclassedelivro.ométodocriarlivro passaaserresponsávelpelofabricodeobjectos. Exemplodocódigo public abstract class Livraria { public ArrayLis<Livro> livros; public abstract Livro CriarLivro(); public class Quiosque extends Livraria { public Livro CriarLivro() { return (new Jornal()); public class Livro { public class Jornal extends Livro { OpadrãoFactoryMethoddeveserusadoquando: Aclassenãoconsegueanteciparaclassedeobjectosquedevecriar. Aclassequerassuassubclassesparaespecificarosobjectosquecria. Asclassespassamaresponsabilidadeparaumadasváriassubclasses,equersesaber quesubclassetemessaresponsabilidade.
PROTOTYPE Opadrãoprototypepermitecriarnovosobjectosatravésdeumacópiadeumprotótipo. Oprotótipopermiteespecificarotipodeobjectosacriar. Opadrãoprototypeéusado: quandosepretendequeaaplicaçãosejaindependentenomodocomooscomponentessão criados,definidosporcomposiçãoerepresentados; quandoasclassesainstanciarsãoespecificadaemtempodeexecução,porexemplo,através deumcarregamentodinâmico; parapermitiraconstruçãodeclasseshierárquicasdefabrico; quandoasinstânciasdeumaclassetêmpoucascombinaçõesdeestado.émaisconveniente instalaronúmerocorrespondentedeprotótiposdoqueinstalarmanualmenteaclassedecada vezparaumestadoespecífico. AclassePrototypedefineumainterfaceparaimplementarclone. AclasseConcretePrototypeimplementaaoperaçãodeclone. AclasseClientcriaumnovoobjectopedindoaoPrototypepararealizaroclone. public abstract class Multimedia implements Cloneable{ private String descricao; public Multimedia clone() { Multimedia clone = null; try{ clone=(multimedia)super.clone(); clone.setdescricao(""); catch(clonenotsupportedexception cnse) { cnse.printstacktrace(); return clone; public String getdescricao() { return descricao; public void setdescricao(string descricao) { this.descricao=descricao;
public class CD extends Multimedia { private int duracao; public int getduracao() { return duracao; public void setduracao(int duracao) { this.duracao=duracao; public CD clone(){ CD cd = (CD) super.clone(); return cd; public String tipo() { return new String("sou um cd"); public class DVD extends Multimedia{ private int tamanho; public int gettamanho() { return tamanho; public void settamanho(int tamanaho) { this.tamanho = tamanaho; public String tipo() { return new String("sou um dvd"); public DVD clone() { DVD dvd = (DVD) super.clone(); return dvd; public class MultimediaCreator { private Multimedia cd = new CD(); private Multimedia dvd = new DVD(); public MultimediaCreator() { cd.setdescricao("cd"); dvd.setdescricao("dvd"); public Multimedia getmultimedia(string tipo) { if(tipo.equals("cd")) { return (Multimedia) cd.clone(); else if(tipo.equals("dvd")) { return (Multimedia) dvd.clone(); return null; public class Cliente { MultimediaCreator mc = new MultimediaCreator(); CD c = (CD)mc.getMultimedia("cd"); DVD d = (DVD)mc.getMultimedia("dvd"); System.out.println(c.tipo); System.out.println(d.tipo);
SINGLETON Singletonéumpadrãodeprojectosimples. OpadrãoSingletonasseguraqueumaclassetemapenasumaúnicainstânciaeforneceum pontoglobaldeacessobemconhecido. Éimportanteparaalgumasclassesterumaúnicainstância.Porexemplo,sódevehaverum sistemadeficheiroseumúnicogestordejanelas. Paraassegurarqueaclassetemunicamenteumainstânciapode secriadaumavariávelglobal queindicaseaclassejáfoiounãoinstanciadamasestasoluçãonãogaranteaunicidadeda instância.amelhorformaétornaraprópriaclasseresponsávelpelaúnicainstânciadamesma, queéopadrãosinpleton.destaformaédefinidaumaoperaçãogetinstance()quepermite acederaumaúnicainstânciadaclasse. OpadrãoSingletondeveserusadoquando: Fornecessáriohaverumaúnicainstânciadeumaclasseeessainstânciatemde facultarumpontodeacessobemconhecido; Ainstância(única)forextensívelatravésdesubclasses,possibilitandoousodeuma instânciaestendidasemalterarocódigo. AestruturadopadrãoSingletonéaseguinte Exemplodecódigo public final class Pope { private static Pope instance = null; public static Pope getinstance() { if (instance==null) { instance = new Pope(); return instance; public class NameOfPope { Pope papa; papa=pope.getinstance();