sexta-feira, 29 de outubro de 2010

Design Patterns (PHP) - Factory

O que é design pattern?
São formas de se escrever código de programação utilizando conceitos de melhores práticas de programação que visam mostrar soluções para problemas comuns no desenvolvimento de software.

O que é o factory?
Basicamente, o pattern factory consiste em uma fábrica de objetos de classes que implementam uma mesma interface e quando precisamos de uma instância de uma destas classes, a factory nos retorna este objeto de forma dinâmica.

A interface abaixo será implementa por algumas classes posteriormente.

Supondo que exista a interface IBanco:

1.

2. Interface IBanco {

3. public function connect();

4. }

5.

A interface IBanco define o método connect() que deverá ser comum a todas as classes que a implementarem.

Vamos agora, criar mais três classes:

A primeira será a classe mysql que será responsável pela comunicação com o SGBDR mySQL, a segunda será a classe postgres, que será responsável pela comunicação com o SGBDR PostgreSQL e por fim, a classe oracle, que se comunicará com o SGBDR ORACLE.

mysql.php:

1.

2. include_once ‘Ibanco.php’;

3. class mysql() implements IBanco {

4. public function connect() {

5. return new PDO('mysql:host=localhost;dbname=banco','root','');

6. }

7. }

8.

postgres.php:

1.

2. include_once ‘Ibanco.php’;

3.

4. class postgres() implements IBanco {

5. public function connect() {

6. return new PDO('pgsql:host=localhost port=5432 dbname=banco user=username password=senha ');

7. }

8. }

9.

oracle.php:

1.

2. include_once ‘Ibanco.php’;

3. class oracle() implements IBanco {

4. public function connect() {

5. return new PDO(’OCI:dbname=accounts;charset=UTF-8′, ‘username’, ’senha’‘);

6. }

7. }

8.

Utilizamos a palavra reservada implements para informar que as classes acima implementam a interface IBanco.

Agora vamos criar a classe Factory que nos retornará um objeto de uma dessas classes sem que o usuário que está utilizando estas classes precise saber o nome real da classe.

Vejamos então a implementação desta classe:

1.

2. include_once ‘mysql.php’;

3. include_once ‘postgres.php’;

4. include_once ‘oracle.php’;

5.

6. class BancoFactory {

7. public function factory($banco) {

8. return new $banco();

9. }

10. }

Na classe acima, de acordo com o parâmetro passado ("mysql", "postgres" ou "oracle"), é retornada uma instância de sua classe respectiva e se um dia houver uma mudança qualquer, por exemplo no nome da classe, você só precisará mudar em um lugar, na classe Factory.

Agora vamos executar esta classe:

1.

2. include_once ‘BancoFactory.php’;

3. $bancoFactory = new BancoFactory();

4.

5. // Criando instância da classe mysql

6. $connMysql = $bancoFactory->factory(mysql);

7. print_r($connMysql->connect());

8.

9. // Criando instância da classe postgres

10. $connPostgres = $bancoFactory->factory(“postgres”);

11. print_r($connPostgres->connect());

12.

13. // Criando instância da classe oracle

14. $connOracle = $bancoFactory->factory(“oracle”);

15. print_r($connOracle->connect());


Nenhum comentário:

Postar um comentário