O padrão Abstract Factory pode ser implementado junto com o Factory Method?
Estava a ler um tópico do fórum que fala sobre AbstractFactory e FactoryMethod.
Entretando li a seguinte frase:
>
Citar
AbstractFactory define uma interface para a criação de uma família de produtos relacionados ou dependente uns dos outros sem que você precise especificar explicitamente as classes.
Considere o seguinte adaptador:
Adapter.php
<?php
namespace Teste\Db;
use Teste\Db\Adapter\DbInterface;
class Adapter
{
private $config = null;
public function __construct(array $config)
{
$this->config = $config;
}
public function factory()
{
$db = $this->config['db'];
$class = __NAMESPACE__ . '\Adapter\DbAdapter' . $db;
return new $class($this->config);
}
}
Repare que essa classe possui o método "factory" que retorna a instância de uma nova classe conforme o arquivo de configurações:
**Config.ini**
db = MySQL
dbname = fixeads
username = 'root'
passwd = 'root'
host = localhost
debug = true
Utilizei o padrão "Factory Method" por saber qual classe que deverá ser utilizada apenas no momento da execução do script.
Repare que no arquivo de configurações há uma definição:
db = MySQL
Com isso o adaptador irá gerar uma instância da classe "DbAdapterMySQL" (na verdade a classe é do tipo "DbInterface", veja abaixo):
<?php
namespace Teste\Db\Adapter;
use Teste\Util\Iterator\Collection;
class DbAdapterMySQL extends \PDO implements DbInterface
{
public function __construct(array $config)
{
$dsn = "mysql:dbname={$config['dbname']};host={$config['host']}";
parent::__construct($dsn, $config['username'], $config['passwd']);
$this->setAttribute(self::ATTR_DEFAULT_FETCH_MODE, self::FETCH_ASSOC);
}
public function insert($table, array $fields)
{
//inserir
}
public function select($table, $cols = '*', $where = [])
{
//selecionar
}
public function getFields($table)
{
//descrição dos campos
}
}
Repare que a classe implementa a interface "DbInterface":
<?php
namespace Teste\Db\Adapter;
interface DbInterface
{
public function __construct(array $config);
public function select($table, $cols = '*', $where = null);
public function insert($table, array $fields);
public function getFields($table);
}
E para utilizar tudo faço o seguinte:
$config = parse_ini_file(sprintf(__DIR__ . '%sconfig.ini', DIRECTORY_SEPARATOR));
$dbAdapter = new DbAdapter($config);
Mapper::$defaultAdapter = $dbAdapter->factory();
Posso dizer que utilizei os padrões "**Adapter**", "**Factory Method**" e "**Abstract Factory**" nas classes acima?
-
O padrão "Adapter" porque utilizei a classe "DbAdapterMySQL" para contruir uma interface compatível com a aplicação, sendo assim quando mudar de MySQL para MSSQL tenho apenas que criar uma nova classe "DbAdapterMSSQL" e implementar os respectivos métodos.
-
O padrão "Factory Method" porque utilizei o método "factory" da classe "Adapter" para retornar uma instância da classe que deverá ser usada (em tempo de execução) de acordo com as configurações do projeto.
-
E aqui é a minha grande dúvida, posso dizer que utilizei o padrão "Abstract Factory"? Uma vez que utilizei a interface "DbInterface" para a criação de uma família de produtos relacionados, que nesse é para manipulação do SGBD?
Se sim, então a classe "Adapter" juntamente com as classes "DbInterface" e "DbAdapterMySQL" são a implementação do padrão "Abstract Factory"?
Discussão (1)
Carregando comentários...