Dando prosseguimento a série de artigos sobre Design Patterns, hoje vou falar sobre o padrão de projeto Singleton.

Singleton

Objetivo – criar uma estrutura para controle da instanciação de um tipo de objeto. Imaginando que um objeto apenas pode ser criado uma única vez, o padrão de projeto Singleton oferece um controle sobre o uso do objeto.

Em alguns projetos é necessário apenas uma instância de uma determinada classe. Por exemplo, em uma aplicação onde existe a geração de arquivos de log, uma única classe responsável em fazer a gestão dos logs poderá ser criada. Outro exemplo que posso citar é a de uma aplicação Web. Um único objeto pode ser criado para realizar a gestão da sessão do usuário. Caso o mesmo já possua uma sessão e seja pedida pela aplicação Web criar uma nova, a existente será retornada.

singleton3.png
Diagrama UML representando uma classe Singleton

Exemplo

Segue abaixo um exemplo de código em C++ para demonstrar o padrão de projeto Singleton.


class Session {
        private:
                Session() {}
        public:
                static Session& instance() {
                        static Session *instance = 0;
                        if (!instance)
                                instance = new Session();
                        return *instance;
                }
};
class WebApp {
        public:
                void main () {
                        obj = Session.instance();
                }
}

No exemplo acima a classe WebApp realiza a instanciação da classe Session. A instanciação da classe Session deve sempre ser realizada através do método estático instance. O construtor da classe Session nunca deve ser chamado diretamente, de modo a permitir que a própria classe realize o controle dos objetos que são criados.

Abraços e até mais! :)

Então pessoal! De volta ao batente, vou falar hoje sobre o Software Design Pattern Factory Method.

Factory Method

Objetivo – criar uma interface em comum para a criação de diversos tipos de objetos correlacionados, deixando a implementação do método para as sub-classes. Constitui-se de um método virtual construtor de objetos.

Para quem anda acompanhando os posts que ando publicando sobre padrões de projeto, por diversas vezes Factory Methods foram usados dentro de outros Design Patterns. O diagrama UML abaixo demonstra um exemplo de uso de Factory Method, onde em uma aplicação há várias seções (MacbookSection e iMacSection) que possuem particularidades para a criação dos objetos que irão compor a seção. Deste modo cada um realiza a instanciação dos objetos através da super classe Product.

factory_method.png
Diagrama UML de um Factory Method

Exemplo

Segue abaixo um código de exemplo demonstrando o uso de um Factory Method em C++.


abstract class Application {

        public:
                abstract Product createProduct();

}

class MacbookSection: public Application {

        public:
                Product createProduct(){
                        return new Macbook();
                }

}

class iMacSection: public Application {

        public:
                Product createProduct(){
                        return new iMac();
                }

}

abstract class Product {

}

class Macbook: public Product {

}

class iMac: public Product {

        }

E assim chegamos ao fim de mais um Design Pattern! Até o momento este é o mais simples de todos os padrões que estudamos. Amanhã irei trazer mais um Design Pattern. Caso alguém tenha alguma dúvida, mesmo relacionada ao código-fonte em C++, fique a vontade para expor nos comentários.

Abraços e até mais! :)

Continuando a série sobre Software Design Patterns, hoje irei falar com o padrão de projeto conhecido como Builder.

Builder

Objetivo – permitir a abstração de uma complexa construção de objetos através de uma interface comum. Alguns objetos podem possuir particularidades na sua construção que podem ser ocultados através da interface de um Builder.

Para a existência do Builder, existem diversas entidades participantes, como posso lista-las abaixo:

  • Director – realiza o pedido de construção do objeto através da interface que o Builder oferece.
  • Builder – é a interface para a criação dos objetos utilizando as classes Concrete Builders.
  • Concrete Builder – define como será realizada a implementação dos Products, realizando sua implementação e definindo métodos para o retorno do resultado.
  • Product – classe que é instanciada pelo Concrete Builder e depois será retornada para o Director.

Podemos fazer uma analogia do processo realizado pelo Builder ao que é feito em um restaurante de fast-food, como é demonstrado aqui.

builder_example12.gif
Diagrama de seqüência em uma rede de fast-food. Retirado daqui.

Ou seja, o cliente ao entrar no restaurante realiza o pedido ao atendente do caixa. Os pedidos são ali realizados e as ordens para preparação de cada um dos componentes do prato são repassadas para os funcionários do restaurante, sem se especificar quem irá fazer o que. “Funcionários do restaurante” é uma interface para a chamada dos Concrete Builders que estão por detrás, que irão realizar a instanciação dos objetos e implementar os métodos para retorno dos resultados. A mesma interface “Funcionários do restaurante” será o meio com o qual o cliente irá obter o produto final.

Vamos imaginar um cenário mais real, onde pretende-se fazer um conversor de registros em um departamento de pessoal. Esse conversor deverá obter os dados através de algum tipo de registro, como um documento de texto estático, e a partir de cada registro determinar se trata de um cliente ou um funcionário da empresa. Clientes e funcionários possuem alguns aspectos em comum e outros não. O diagrama UML abaixo demonstra como seria uma estrutura utilizando o Design Pattern Builder para modelar este ambiente.

builder2.png
Diagrama UML de um Design Pattern Builder

Exemplo

Segue o código em C++ que testa o Desing Pattern Builder.


abstract class Builder {
        public:
                abstract Person createPerson();

                abstract void storePerson();

}

class CustomerConcreteBuilder: public Builder {
        public:
                void createPerson() {
                        println(“Person created!”);
                }

                void storePerson() {
                        println(“Person stored!”);
                }
}

class StaffConcreteBuilder: public Builder {
        public:
                void createPerson(char c) {
                        println(“Caractere Tex”);
                }

                void storePerson() {
                        println(“Paragrafo Tex”);
                }
}

class Director {

        public:
                void fullOfPeople() {

                         ifstream in ( “registers.txt” );

                        if ( in.is_open() ) {
                                string line;
                                while ( getline ( in, line ) ) {
                                        // process line and get the type
                                        switch (type) {
                                                case CUSTOMER:
                                                        builder = new CustomerConcreteBuilder();
                                                        builder.createPerson();
                                                        builder.storePerson();
                                                        break;
                                                case STAFF:
                                                        builder = new StaffConcreteBuilder();
                                                        builder.createPerson();
                                                        builder.storePerson();
                                                        break;
                                        }
                        }
                }
}

public class Operator {

        public:
                int main() {

                         Director director;
                        director.fullOfPeople();

                }
}


O exemplo acima começa sua execução na classe Operator. Esta classe faz o papel de instanciar a classe Director e fazer com que a mesma inicie o pedido de criação de objetos. A partir do momento que o método fullOfPeople é executado, o objeto da classe Director é responsável em realizar a criação dos objetos de acordo com o tipo de registro que encontra no arquivo “registers.txt”.

Caso o exemplo acima seja demasiado simples, aqui e aqui você poderá obter outros cenários de uso do padrão de projeto Builder.

Até o próximo Desing Pattern! :)

Faaaala povo! Alguém por acaso ainda lê isso aqui regularmente? Se lia com certeza já parou faz tempo. Não atualizo o blog faz meses. Como me desculpar não é algo digno de se fazer quando não posso prometer que irei mudar, vou me focar apenas em escrever algo interessante. Neste momento me apetece escrever sobre Software Design Patterns. Não que eu seja um grande programador, mas eu preciso treinar o conteúdo e acho que farei bem escrever enquanto estudo. Vou inaugurar então com este post a sessão Software Design Patterns no blog, onde irei em cada post falar sobre algum modelo para a padronização do código.

O primeiro Software Design Pattern, ou em bom português, Padrões de Projeto de Software, que irei falar é Abstract Factory.

Read the rest of this entry »

Problema simples: contar os endereços distintos que existem em um dump criado pelo tcpdump. Melhor solução, pelo menos ao meu ver, era correr para o Shell Script. Tenho que admitir que é uma das linguagens mais simples e flexíveis que conheço. Não sou nenhum bom entendedor, mas sei fazer alguma coisa quando possível. Vamos fazer o desafio proposto então.

Read the rest of this entry »

Situação: estava fazendo o desenvolvimento de um aplicativo em uma máquina virtual — Ubuntu 8.04.2 — com PHP e MySQL. Eis que resolvo começar a trabalhar nativamente, utilizando o PHP e MySQL no próprio Mac OS. Mas a base de dados que já estava implementada e populada na máquina virtual. O que fazer para “transportá-la” para outro MySQL? Solução simples, como mostro a seguir.

Read the rest of this entry »

Fala galera! Voltando para falar sobre o Mac novamente, hoje quis deixar o uso da máquina virtual Ubuntu para passar a fazer o meu trabalho atual nativamente, o que me poupa memória volátil do equipamento e me permite usar um software mais elaborado para o desenvolvimento, algo como o Eclipse ou semelhante. Vamos ver como se faz para por a funcionar o Apache e PHP juntos no Mac OS X.

Read the rest of this entry »

Olá pessoal! Seis meses sem postar nada por aqui não significa que nunca mais o farei. Estou de volta e com muita coisa para escrever. Como o título do post sugere, sou mais um dos seguidores fiéias do tio Jobs louvando-o com um Macbook em mãos. Então já criei novas novas Tags para sempre que puder deixar por aqui dicas do Mac OS X.

Deixando de contar histórias, vamos ao que interessa: criar rotas persistentes no Mac OS. Se há algum meio mais “simples” e bonito para isso eu não sei, mas a referência que busquei indicou me passos a serem realizados em um console de comandos. Nada de muito complexo, como veremos adiante.

Read the rest of this entry »

Olá a todos! De tempos em tempos eu volto aqui para uma dica, porém acredito que no próximo mês terei mais tempo para escrever por aqui, já que terei um trabalho de pesquisa a fazer e uma boa maneira de ir treinando é também escrever. Mas, voltando ao que importa agora, vou dizer-lhes como devemos trabalhar com o arquivo /etc/fstab do Ubuntu (desde a versão Dapper, acredito eu) e outras distribuições mais atuais. Para quem já reparou, o arquivo em questão está bem diferente do usual, possuindo termos como os UUIDs

Olá a todos! De tempos em tempos eu volto aqui para uma dica, porém acredito que no próximo mês terei mais tempo para escrever por aqui, já que terei um trabalho de pesquisa a fazer e uma boa maneira de ir treinando é também escrever. Mas, voltando ao que importa agora, vou dizer-lhes como devemos trabalhar com o arquivo /etc/fstab do Ubuntu (desde a versão Dapper, acredito eu) e outras distribuições mais atuais. Para quem já reparou, o arquivo em questão está bem diferente do usual, possuindo termos como os UUIDs (Universally Unique Identifier) em vez dos tradicionais dispositivos do diretório /dev. Explico a seguir como realizar modificações no arquivo sem querer este padrão.

Read the rest of this entry »

Olá pessoal! Sumido mas ainda vivo! Vim aqui para dizer como resolvi um probleminha chato. Para início de conversa, já comentei em posts anteriores que eu utilizo Windows. Sim, é verdade! E o que me deixava mais chateado ao utilizá-lo era o fato do plugin FireGPG não funcionar no Firefox do Windows. Oras! Como pode funcionar no meu Linux e no Windows nada? Sempre deixei de lado para resolver depois, mas hoje realmente passei um aperto por não poder utilizá-lo e resolvi sair a caça.

Read the rest of this entry »

c

RSS RNP

RSS Meu Twitter

  • Ocorreu um erro. É provável que o feed esteja indisponível. Tente mais tarde.