Opa galera, tudo lindo?
Imagino que sim.
Bom eu gosto muito de design patterns(padrões de design de código neste caso), e um que eu gosto bastante por ser realmente prático, é o Factory Method , Eta pattern simples de usar, ta loco, é quase mais prático do que alugar as bicicletas do itau na rua.
Pois bem, o pattern Factory em si, do ingles Fábrica funciona como uma fábrica de objetos. Por exemplo uma ProductFactory cria um objeto Product pra nós.
A Factory normal precisa ser instanciada e ai se usa um método para ai então construir o objeto necessário, já no Factory Method nós mudamos isso e usamos diretamente uma chamada de método estático.
Vamos por a mão na massa então.
Digamos que tenho um sistema que precisa criar vários produtos, computadores, notebooks e etc.
Então vou ter minha fabrica de produtos ou seja a ProductFactory, ela vai ter um metodo estático que vai receber por padrão o nome do tipo de produto que eu quero criar.
Seguindo eu vou concatenar ele com o nome padrão para a minhas classes de produtos especificos e criar assim o nome correto para a classe do produto especifico.
Logo adiante eu testo se a classe realmente existe(isso é importante), se não existir eu lanço uma excessão.
namespace FactoryMethod\Factory; class ProductFactory { public static function create($kind) { $kindClass = "FactoryMethod\Handler\Product{$kind}"; if(!class_exists($kindClass)) { throw new \Exception("Class Product{$kind} not found"); } return new $kindClass; } }
Bom com nosso Factory Method pronto agora é barbada né? vamos ter la duas classes como essas
namespace FactoryMethod\Handler; class ProductComputer { private $name; private $information; public function __construct() { $this->name = 'Computer k6'; $this->information = '8gb memory'; }
namespace FactoryMethod\Handler; class ProductNotebook { private $name; private $information; public function __construct() { $this->name = 'Notebook Vaio'; $this->information = '4gb memory'; }
Elas são dois tipos de produtos e a nossa Factory basicamente vai concatenar o Product com o kind que for passado por parametro como abaixo.
use FactoryMethod\Factory\ProductFactory; $computer = ProductFactory::create('Computer'); $notebook = ProductFactory::create('Notebook'); echo "Computer Name: " . $computer->getName(); echo "NoteBook Name: " . $notebook->getName();
Pronto, temos duas instancias de objetos diferentes, e o melhor usando apenas umas chamada. O nosso factory method faz o trabalho dele muito bem, e ainda nos poupa um monte de chamadas de classes e possivelmente um switch case pra testar as classes.
Valeu galera, espero ter ajudado.
Um grande abraço.