Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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"?
>
10 horas atrás, Filipe_Moraes disse:
-
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.
Ta ai o motivo pelo qual descartaria sua classe de conexão se estivesse em um repositório, tem patterns desnecessários o "adpater" e alguns métodos que não fazem o menor sentido estar dentro do arquivo de conexão "CRUDs."
Metaforicamente falando!!
Pensa em uma fábrica de camisetas, a unica coisa que você vai fazer lá é o pedido.
Sendo a quantidade, cores e tamanho.
Desta forma, não é responsabilidade sua informar quais métodos a fábrica deva utilizar para fabricar sua camiseta, ela quem tem que se virar e retornar o que pediu, nem que seja um feedback dos prazos de entrega, valor etc.
Então oque você iria enviar para uma fabrica de conexão abstrata "Abstract Factory" nada mais do que suas credencias, ou seja a DSN e dados de acesso.
Cruds, já é outros patterns, um Repository Pattern por exemplo.