Padrão de Projeto Factory em JavaScript

O Padrão de Projeto Factory consiste em uma classe ser especializada na criação de um determinado tipo de objeto. Geralmente, esse padrão é utilizado para abstrair a criação de objetos complexos.
Vamos utilizar o Factory para abstrair a complexidade de criação de um Proxy.
Continuaremos o mesmo projeto utilizado para explicar o Padrão de Projeto Proxy.
Inicialmente, criamos a pasta services
no projeto e, dentro dela, a classe ProxyFactory
.
Não é uma regra em si, mas quando implementamos o padrão Factory, utilizamos métodos estáticas, de modo a não criar instâncias da classe ao utilizá-la.
Em seguida, recortamos nosso Proxy que atualmente encontra-se na classe ContatosController
do projeto, inserindo-o no método create
da classe ProxyFactory
, e fazemos as adaptações necessárias.
class ProxyFactory { static create(objeto, props, acao) { return new Proxy(objeto, { get(target, prop, receiver) { if(ProxyFactory._ehFuncao(target[prop]) && props.includes(prop)) { return function() { Reflect.apply(target[prop], target, arguments); acao(target); } } return Reflect.get(target, prop, receiver); } }); } static _ehFuncao(func) { return typeof(func) == typeof(Function); } }
Aproveitamos também para criar o método privado _ehFuncao
, melhorando a legibilidade e manutenção do código.
Agora em ContatosController
, passamos a criar nosso proxy da lista de contatos com o auxílio do método estático create
da classe ProxyFactory
.
class ContatosController { constructor() { let $ = document.querySelector.bind(document); this._listaDeContatos = ProxyFactory.create( new ListaDeContatos(), ['adiciona', 'apaga'], model => this._contatosView.update(model) ); //Restante do código omitido
Mas não devemos esquecer também de importar o ProxyFactory
em nosso arquivo html.
Com isso, agora toda vez que precisarmos criar um proxy, basta pedir ao ProxyFactory
que faça isso para nós. Dessa forma, ganhamos também em reaproveitamento de código.