A “gangue dos quatro” (GoF - pessoas que catalogaram os padrões de projeto mais comuns), realizou um grande trabalho de pesquisa que resultou em uma classificação dos padrões em algumas categorias: Criacionais, Estruturais e Comportamentais.
Nota: Como ficaria muito extensa a explicação e demonstração de cada padrão, demonstraremos apenas um padrão de cada classificação e nas referências do final do artigo maiores detalhes poderão ser encontrados.
Criacionais
Os padrões dessa categoria têm a característica de abstrair a instanciação e o processo de instanciação de objetos, de tal forma que um sistema pode não depender (saber) como são criados determinados objetos. Para conseguir essa independência e flexibilidade, os padrões criacionais encapsulam as classes concretas que existem. Nessa categoria existem cinco padrões mais comuns:
· Abstract Factory;
· Builder;
· Singleton;
· Prototype;
· Factory Method.
Factory Method
Fornece uma interface para criação de objetos, porém essa criação é determinada por suas subclasses. Vamos a um exemplo prático. Podemos utilizar esse padrão para abstrair a criação de formulários de nossos sistemas, para isso inicie um novo projeto no Delphi 7 (você pode utilizar também o Delphi 2005/2006) e organize o formulário principal como é exibido na Figura 1.
Figura 1. Formulário principal
Agora adicione mais três formulários e salve o projeto, podendo-se deixar os nomes padrão. Vamos agora criar nossa classe que usará o padrão Factory Method. Crie uma nova unit no projeto e a salve como “FormFactoryU.pas” e adicione a classe da Listagem 1. Adicione também uma função pública, da qual nossa “fábrica” (Factory) de formulários será acessada:
function FormFactory: TFormFactory;
Nossa fábrica criará formulários por seus nomes, através do método CreateForm. Cada formulário que será criado deve registrar-se em nossa “fábrica”, através do método RegisterForm, para que ela possa instanciá-lo quando for necessário. Veja como o formulário 2 é registrado na Listagem 2.
Listagem 1. Classe Factory
uses Classes, Forms;
type
TFormFactory = class
private
FList: TStrings;
public
constructor Create;
destructor Destroy; override;
function CreateForm(
const aFormName: string): TForm;
procedure RegisterForm(const aFormName: string;
aFormClass: TComponentClass);
end;