# Singleton

# Histórico de Versão

Data Autor(es) Descrição Versão
26/10/2020 Fábio Teixeira(fabio1079) Adicionando utilização do singleton no projeto 0.1
26/10/2020 Lucas Midlhey(lucasmidlhey) Aplicabilidade de projeto 0.2
26/10/2020 Cauê(caue96) Incrementando a introdução do que é o padrão singleton 0.3

# Introdução

  O Singleton é um padrão de projeto criacional que permite garantir que uma classe tenha apenas uma instância, enquanto provê um ponto de acesso global para essa instância.

  O padrão singleton tem 2 característica que todos os códigos que a implementam possuem: 1 - Um construtor padrão privado, para prevenir que outros objetos usem o operador new com a classe singleton; 2 - Um método estático de criação que age como um construtor. Esse método chama o construtor privado rodando de forma escondida para criar um objeto e o salva em um campo estático. Todas as chamadas seguintes para esse método retornam o objeto em cache.

# Estrutura

Estrutura Strategy

# Aplicações no Projeto(QRodízio)

# Disclaimer

Primeiramente é bom deixar claro que nosso projeto está utilizando de linguagens multi-paradigmas(python e javascript) sendo assim, adaptações aos padrões são necessárias para não fugir do estilo do código utilizado.

A Linguem python possui em seu "zen of python" a seguinte declaração: "Simple is better than complex". Seguindo essa filosifia, decidimos que, se algo pode ser feito em uma função, então será feito em uma função. Assim mantendo um código mais limpo, simples e fácil de manter.

# Utilização

Em nossa base de código o padrão singleton está previsto para ser utilizado mas nao está implementado no momento. Isto se deve ao fato de que ele será utilizado para manter um poll de funcionários logados para notificá-los. Porém, toda a parte de notificações(que irá utilizar bastante do observer) está prevista para a próxima sprint e ficou fora dessa release.

Segue um exemplo de como o padrão singleton poderá ser utilizado na próxima sprint:

# Exemplo 1, o mais simples possível

_logged_employees_pool = []

def add_employee(employee):
    global _logged_employees_pool
    _logged_employees_pool.append(employee)

def get_employees():
    global _logged_employees_pool
    return _logged_employees_pool

# Exemplo 2, java like

class SingletonMeta(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            instance = super().__call__(*args, **kwargs)
            cls._instances[cls] = instance
        return cls._instances[cls]


class LoggedEmployeesPoolSingleton(metaclass=SingletonMeta):
    def __init__(self):
        self._logged_employees = []

    def add_employee(self, employee):
        self._logged_employees.append(employee)

    def get_employees(self):
        return self._logged_employees

# Aplicabilidade

Utilize o padrão Singleton quando uma classe em seu programa deve ter apenas uma instância disponível para todos seus clientes. por exemplo, um objeto de base de dados único compartilhado por diferentes partes do programa.

O padrão Singleton desabilita todos os outros meios de criar objetos de uma classe exceto pelo método especial de criação. Esse método tanto cria um novo objeto ou retorna um objeto existente se ele já tenha sido criado.

Utilize o padrão Singleton quando você precisa de um controle mais estrito sobre as variáveis globais.

Ao contrário das variáveis globais, o padrão Singleton garante que há apenas uma instância de uma classe. Nada, a não ser a própria classe singleton, pode substituir a instância salva em cache.

Observe que você sempre pode ajustar essa limitação e permitir a criação de qualquer número de instâncias singleton. O único pedaço de código que requer mudanças é o corpo do método getInstance.

# Referências

  • REFACTORING.GURU. Strategy. Disponível em: https://refactoring.guru/pt-br/design-patterns/singleton . Acesso em: 26 de outubro. 2020.