Design Patterns no JavaScript – Factory
Leia em 1 minuto
Criar objetos é a especialidade do Factory Pattern. A grande vantagem desse pattern é que ele reduz a duplicação das tarefas de inicialização em objetos similares, além de permitir abstrair construções que podem ser complexas.
Normalmente o método responsável por inicializar os objetos é um método estático, que no contexto do JavaScript pode ser adaptado para um método adicionado diretamente à função construtora.
function User(attrs) {
for (var name in attrs) {
this[name] = attrs[name];
}
}
User.build = function(attrs) {
return new User(attrs);
};
O Factory Pattern pode ser uma boa alternativa para evitar que funções construtoras não sejam chamadas sem a palavra-chave new
. Para inicializar um novo usuário, podemos chamar a Factory User.build
.
var user = User.build({
name: "John Doe"
, email: "john@example.org"
});
Ele também pode ser uma boa alternativa para normalizar parâmetros antes da instanciação; lembre-se que no JavaScript não existe sobrecarga de métodos. Imagine que você queira simplificar a instanciação de um novo objeto User
; caso um objeto seja passado como argumento, ele é utilizado. Se dois parâmetros forem passados, um objeto contendo o nome e e-mail deve ser definido antes.
/**
* The User.build factory can be called with two distict signatures:
*
* — An object representing the attributes.
* — Two arguments representing the name and e-mail.
*/
User.build = function(attrs) {
if (arguments.length === 2) {
attrs = {
name: arguments[0]
, email: arguments[1]
};
}
return new User(attrs);
};
Finalizando
O Factory Pattern é uma forma excelente de reduzir/remover complexidades na criação de objetos. Os exemplos deste artigo são simples, claro, mas não se deixe enganar. Factories podem ser extremamante complexos e tudo vai depender de quão complexo é a definição de seus objetos, podendo conter inclusive toda a parte de configuração.
No próximo artigo desta série vou mostrar um pouco sobre o Decorator Pattern.