Jump to content

Filipe_Moraes

Members
  • Content count

    1199
  • Joined

  • Last visited

  • Days Won

    1

Filipe_Moraes last won the day on March 29 2013

Filipe_Moraes had the most liked content!

Community Reputation

15 Levemente Bom

2 Followers

About Filipe_Moraes

  • Birthday 05/23/1987

Informações Pessoais

  • Sexo
    Masculino
  • Localização
    Lisboa - Portugal
  1. Estava a ler um tópico do fórum que fala sobre AbstractFactory e FactoryMethod. Entretando li a seguinte frase: 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"?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.