Go to English Blog

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.