Factory: a essência dos padrões Factory Method e Abstract Factory

Autor: IT Sectr Publicado: 2026-02-17 Tempo de leitura: 7 min

Factory — um padrão criacional que delega a criação de objetos a métodos de fábrica. No desenvolvimento mobile, Factory Method e Abstract Factory são usados para criar ViewModel, NetworkClient, Repository e outras dependências. Factory isola a lógica de instanciação, simplificando a substituição de implementações. Mais detalhes — no Refactoring Guru: Factory Method.

Principais pontos

  • Factory — um padrão criacional para criar objetos sem especificar uma classe concreta
  • Factory Method — um método numa superclasse, sobrescrito em subclasses para criar objetos
  • Abstract Factory — uma interface para criar famílias de objetos relacionados
  • Testes — fábricas simplificam a substituição de implementações por objetos mock em testes
  • DI vs Factory — Injeção de Dependência substitui fábricas em aplicações modernas

O que é Factory: a essência do padrão de criação de objetos?

Factory — um padrão de design criacional do catálogo GoF. A ideia principal: mover a lógica de criação de objetos do código cliente para um método ou classe separada. O cliente trabalha com uma interface ou classe abstrata, enquanto a implementação concreta é criada pela fábrica. Isso implementa o princípio de Inversão de Dependência: o cliente não depende de classes concretas, apenas de abstrações.

Duas variedades de Factory: Factory Method e Abstract Factory. Factory Method — um único método numa classe que as subclasses sobrescrevem para criar objetos. Abstract Factory — uma interface com uma família de métodos de fábrica para criar grupos de objetos relacionados. Ambas as variantes resolvem o mesmo problema: o cliente não chama new MyClass() diretamente, mas pede à fábrica para criar um objeto conforme seu tipo ou parâmetros.

Factory vs new() — a criação direta de objetos acopla fortemente o código a uma implementação concreta. Factory adiciona uma camada: alterar a implementação requer editar apenas a fábrica, não todos os clientes. No desenvolvimento mobile, Factory é usado ativamente para criar ViewModel (ViewModelProvider.Factory), clientes de rede (Retrofit.create()), adaptadores de lista e fábricas de serialização. Contêineres DI (Dagger, Koin) geram fábricas automaticamente.

Factory Method: exemplos em Swift e Kotlin

Factory Method — um método declarado num protocolo ou classe abstrata que retorna um objeto de um tipo específico. As subclasses implementam o método, criando instâncias concretas. Em Swift, pode ser um método estático num protocolo ou um método numa classe base. Em Kotlin — um companion object com um método de fábrica ou open fun numa classe abstrata. O padrão é amplamente usado para criar parsers, fábricas de erro e construtores de consultas.

swift
protocol PaymentGateway {
    func processPayment(amount: Decimal) async throws -> PaymentResult
}

final class StripeGateway: PaymentGateway { /* ... */ }
final class ApplePayGateway: PaymentGateway { /* ... */ }

enum PaymentType { case stripe, applePay }

final class PaymentFactory {
    // Factory Method
    static func create(type: PaymentType) -> PaymentGateway {
        switch type {
        case .stripe: return StripeGateway()
        case .applePay: return ApplePayGateway()
        }
    }
}

// Uso
let gateway = PaymentFactory.create(type: .stripe)

Versão Kotlin do Factory Method usa companion object ou sealed class para limitar tipos. Sealed class garante que o ramo when cubra todos os tipos possíveis — o compilador verifica a completude. Isso é típico em projetos Android onde a fábrica cria diferentes implementações de Repository ou DataSource conforme o build flavour ou configuração.

kotlin
sealed class PaymentType {
    object Stripe : PaymentType()
    object ApplePay : PaymentType()
}

interface PaymentGateway {
    suspend fun processPayment(amount: BigDecimal): PaymentResult
}

class PaymentFactory {
    companion object {
        fun create(type: PaymentType): PaymentGateway = when (type) {
            PaymentType.Stripe -> StripeGateway()
            PaymentType.ApplePay -> ApplePayGateway()
        }
    }
}

Abstract Factory: famílias de objetos relacionados

Abstract Factory — um padrão para criar famílias de objetos relacionados ou interdependentes sem especificar suas classes concretas. O cliente trabalha com a interface da fábrica abstrata, que define métodos para criar cada produto da família. Uma fábrica concreta implementa a interface e cria objetos de uma variante específica. Por exemplo, uma fábrica de componentes UI para iOS cria UIButton, UILabel, UITableView, enquanto para Android — Button, TextView, RecyclerView.

Abstract Factory vs Factory Method — Factory Method cria um tipo de objeto através de herança, Abstract Factory cria uma família de objetos através de composição. Factory Method é sobrescrito em subclasses, Abstract Factory fornece múltiplos métodos de fábrica através de um protocolo. Abstract Factory frequentemente contém vários Factory Method. No desenvolvimento mobile, Abstract Factory é usado para componentes dependentes de plataforma, temas de design e fábricas de banco de dados.

CaracterísticaFactory MethodAbstract Factory
Número de produtosUmFamília (múltiplos)
MecanismoHerança (override)Composição (protocolo/interface)
Exemplo iOSPaymentFactory.create()UIComponentFactory para iOS/Android
Exemplo AndroidViewModelProvider.FactoryThemeFactory: criação de botões, textos, cartões
FlexibilidadeSubstituição simples de subclasseSubstituição completa de família

Caso real de Abstract Factory no Android — implementação de diferentes tipos de banco de dados (SQLite vs Room) através de uma única interface DatabaseFactory. A fábrica cria objetos DAO, migrações e pools de conexão. No iOS — uma fábrica de serviços para diferentes ambientes (Development/Staging/Production). Abstract Factory raramente é usado diretamente — suas funções são assumidas por contêineres DI (Dagger Module, Swinject Assembly).

Factory no iOS: protocolos e métodos estáticos

Swift Factory é implementado através de protocolos e métodos estáticos. O protocolo Factory declara um método create() que retorna um tipo abstrato. Uma fábrica concreta implementa o protocolo e cria os objetos necessários. Swift não requer uma classe de fábrica separada para casos simples — um método estático num enum ou struct é suficiente. Para cenários complexos, um protocolo Factory com injeção DI é usado.

Factory no iOS SDK — muitas fábricas do sistema: UIStoryboard.instantiateViewController(withIdentifier:), NSKeyedUnarchiver.unarchivedObject(ofClass:from:), JSONDecoder().decode(_:from:). Desenvolvedores criam fábricas para ViewController (StoryboardFactory), para serviços (ServiceFactory) e para modelos de dados. Factory Method é usado ativamente nas arquiteturas VIPER e Clean Swift para criar módulos de tela.

Factory + DI — uma alternativa moderna: um contêiner DI (Swinject, Factory) gera automaticamente fábricas para tipos registrados. O contêiner armazena receitas de criação de objetos e resolve dependências. A biblioteca Factory (github.com/hmlongco/Factory) usa @Injected(.service) para injeção automática. Fábricas DI são testadas substituindo um módulo inteiro com uma única linha: container.register { MockService() }.

Factory no Android: companion factory e módulos DI

Android Factory — um exemplo clássico: ViewModelProvider.Factory para criar ViewModel com parâmetros. Google recomenda usar Hilt para geração automática de fábricas ViewModel — a anotação @HiltViewModel cria Factory automaticamente. Para objetos simples, um companion object com método create() ou invoke() é usado. Em Kotlin, o operador invoke permite chamar a fábrica como uma função: Factory(param).

Factory no Jetpack Compose — fábricas são usadas para criar estados e efeitos. remember { Factory.create() } cria um objeto no primeiro render e o preserva durante o ciclo de vida do composable. ViewModel no Compose é criado via viewModel() — esta é uma fábrica gerenciada pelo Hilt. No Compose, fábricas são menos comuns explicitamente, pois DI e Compose StateManager gerenciam a criação de objetos.

Factory vs Hilt — Dagger/Hilt gera automaticamente fábricas em tempo de compilação. @Module + @Providers substitui Factory Method, @Binds substitui Abstract Factory. Fábricas manuais permanecem relevantes para seleção dinâmica de implementação em tempo de execução (testes A/B, feature flags). Para dependências estáticas, Hilt automatiza completamente a criação de objetos — o desenvolvedor escreve apenas interfaces e anotações.

Perguntas Frequentes

Como o Factory Method difere do Abstract Factory?

Factory Method cria um tipo de objeto através de herança — a subclasse sobrescreve o método de fábrica. Abstract Factory cria uma família de objetos através de composição — a interface da fábrica declara métodos para múltiplos produtos. Factory Method é mais simples, Abstract Factory é mais flexível para componentes dependentes de plataforma ou temáticos.

Quando usar Factory em vez de DI?

Factory é justificada para seleção dinâmica de implementação em tempo de execução (testes A/B, feature flags, API diferente para diferentes níveis). DI (Hilt, Dagger, Koin) é preferível para dependências estáticas — automatiza criação e injeção. Factory e DI não são mutuamente exclusivos: DI pode usar Factory dentro de um módulo.

Como testar código que usa Factory?

Factory é testada substituindo a fábrica através de um protocolo. No teste, uma TestFactory é criada implementando o mesmo protocolo e retornando objetos mock. Para métodos estáticos de Factory, o teste é mais complexo — requer um contêiner DI ou swizzling. Recomenda-se sempre usar um protocolo para Factory para manter a testabilidade.

O que é ViewModelProvider.Factory no Android?

ViewModelProvider.Factory é uma interface do Jetpack que permite criar ViewModel com parâmetros personalizados. Sem uma fábrica, ViewModel é criado através de reflexão e só pode ter um construtor vazio. Factory aceita parâmetros (repositório, contexto da aplicação) e os passa ao construtor de ViewModel. Hilt gera Factory automaticamente para @HiltViewModel.

Como Factory se relaciona com o Princípio Aberto/Fechado?

Factory implementa o Princípio Aberto/Fechado: o sistema está aberto para extensão (uma nova implementação é adicionada à fábrica) mas fechado para modificação (o código cliente não muda). Adicionar um novo tipo de produto requer editar apenas a fábrica, não todos os clientes. Esta é a vantagem chave da Factory sobre a criação direta de objetos.

Resumo

  • Factory — um padrão criacional para criar objetos através de abstração
  • Factory Method — um único método sobrescrito em subclasses
  • Abstract Factory — uma interface para criar uma família de objetos
  • iOS — protocolos e métodos estáticos para fábricas
  • Android — companion object, ViewModelProvider.Factory, Hilt
  • DI vs Factory — DI automatiza criação, Factory para seleção dinâmica
  • Testes — o protocolo Factory é obrigatório para substituir implementações

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também