Sobes.tech
Junior

Que padrões de design conhece?

sobes.tech IA

Resposta da IA

Criadores:

  • Singleton: Garante que apenas uma instância de uma classe exista e fornece um ponto de acesso global a ela.
  • Factory Method: Define uma interface para criar um objeto, mas permite às subclasses decidir qual classe instanciar.
  • Abstract Factory: Fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas.
  • Builder: Divide a construção de um objeto complexo em passos, permitindo criar diferentes representações do objeto usando o mesmo processo de construção.
  • Prototype: Cria objetos duplicando uma instância existente (protótipo), em vez de realizar o processo de construção novamente.

Estruturais:

  • Adapter: Converte a interface de uma classe em outra interface que os clientes esperam. Permite que classes com interfaces incompatíveis trabalhem juntas.
  • Bridge: Separa a abstração de sua implementação, permitindo que ambas variem independentemente.
  • Composite: Compõe objetos em estruturas de árvore para representar hierarquias parte-todo. Permite que os clientes tratem objetos individuais e composições de objetos de forma uniforme.
  • Decorator: Adiciona responsabilidades adicionais a um objeto de forma dinâmica, envolvendo-o em um objeto decorador.
  • Facade: Fornece uma interface unificada a um conjunto de interfaces em um subsistema. Define uma interface de nível superior que facilita seu uso.
  • Flyweight: Utiliza o estado compartilhado entre muitos pequenos objetos para reduzir o uso de memória e melhorar o desempenho.
  • Proxy: Fornece um representante ou substituto para outro objeto que controla o acesso a ele.

Comportamentais:

  • Chain of Responsibility: Transmite a solicitação ao longo de uma cadeia de manipuladores. Cada manipulador decide se deve processar a solicitação ou passá-la ao próximo.
  • Command: Encapsula uma solicitação como um objeto, permitindo parametrizar clientes com diferentes solicitações, enfileirar solicitações ou registrar suas execuções.
  • Interpreter: Define a gramática de uma linguagem e fornece um interpretador para interpretar as expressões nessa linguagem.
  • Iterator: Fornece um método para acessar sequencialmente todos os elementos de uma coleção sem revelar sua representação interna.
  • Mediator: Define objetos que controlam a interação entre um conjunto de objetos. Promove um baixo acoplamento ao fazer com que os objetos interajam através de um mediador.
  • Memento: Permite salvar e restaurar o estado interno de um objeto sem violar sua encapsulação.
  • Observer: Define uma dependência um-para-muitos entre objetos, de modo que quando um muda de estado, todos os seus dependentes são notificados e atualizados automaticamente.
  • State: Permite a um objeto alterar seu comportamento quando seu estado interno muda. O objeto parecerá mudar de classe.
  • Strategy: Define uma família de algoritmos, encapsula cada um e os torna intercambiáveis. Permite escolher o algoritmo em tempo de execução.
  • Template Method: Define a estrutura de um algoritmo em uma operação, deixando alguns passos para as subclasses. Permite que as subclasses redefinam certos passos do algoritmo sem alterar sua estrutura.
  • Visitor: Representa uma operação que deve ser realizada sobre os elementos de uma estrutura de objetos. Permite definir novas operações sem alterar as classes dos elementos sobre os quais ela atua.

No desenvolvimento iOS, também são frequentemente encontrados:

  • Model-View-Controller (MVC): Padrão arquitetônico que divide a aplicação em três componentes relacionados: Modelo (dados e lógica de negócio), Visão (interface do utilizador) e Controlador (ligação entre Modelo e Visão).
  • Delegate: Padrão que permite que um objeto aja em nome ou coordene ações de outro objeto.
  • Observer (NotificationCenter): Sistema de distribuição de notificações que permite aos objetos receber mensagens sem uma relação direta entre eles.
  • Target-Action: Mecanismo usado para enviar mensagens de elementos de controlo (por exemplo, botões) para um objeto destino.
  • Coordinator: Padrão para gerir fluxos de navegação numa aplicação, separando a lógica de navegação dos controladores.
  • Dependency Injection: Padrão onde as dependências de um objeto são injetadas de fora, em vez de serem criadas pelo próprio objeto.
// Exemplo Singleton
class SettingsManager {
    static let shared = SettingsManager() // Instância única

    private init() {
        // Inicializador privado para impedir criação externa
    }

    var appVersion: String {
        return Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Desconhecido"
    }
}

// Uso
let settings = SettingsManager.shared
print("Versão da app: \(settings.appVersion)")
// Exemplo Delegate (simples)
protocol ButtonDelegate: AnyObject {
    func buttonWasTapped(_ button: UIButton)
}

class MyButton: UIButton {
    weak var delegate: ButtonDelegate? // Propriedade delegado

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event)
        delegate?.buttonWasTapped(self) // Chamar método do delegado
    }
}

class ViewController: UIViewController, ButtonDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        let myButton = MyButton(frame: CGRect(x: 50, y: 50, width: 100, height: 40))
        myButton.setTitle("Toca-me", for: .normal)
        myButton.backgroundColor = .blue
        myButton.delegate = self // Definir delegado
        view.addSubview(myButton)
    }

    func buttonWasTapped(_ button: UIButton) {
        print("Botão foi tocado no ViewController")
    }
}