Parabéns ao meu colega Kunal ( @techthumb ) por me mostrar isso hoje.
Eu queria que uma única instância (singleton) de um objeto cliente de terceiros estivesse disponÃvel em meu aplicativo. Idealmente, eu deveria ser capaz de fazer a este wrapper as mesmas perguntas que faria ao próprio cliente (delegação).
Aqui está um exemplo de como essa combinação de padrões singleton e delegador pode ser alcançada em Ruby. O exemplo usa a gema google_places de @marceldegraaf :
class GooglePlacesClient < SimpleDelegator
include Singleton
def initialize
client = GooglePlaces::Client.new("[my_api_key]")
super(client)
end
end
Os dois componentes de rubi usados ​​aqui são:
A superclasse SimpleDelegator – que delega todas as chamadas de método suportadas ao objeto passado para o construtor (neste caso, cliente ). Em outras palavras, meu GooglePlacesClient.instance agora responde a todas as mensagens que o GooglePlaces :: Client do gem responde.
O mixin Singleton – que garante que apenas uma instância do meu GooglePlacesClient possa ser criada.
Para completar, aqui está um exemplo de como você consumiria esta classe singleton:
GooglePlacesClient.instance.spots(1, 1)
Isso delega a mensagem de ‘pontos’ para a variável de instância que, por sua vez, responde com uma matriz do tipo GooglePlaces :: Spot para a latitude, longitude fornecida.
Muito arrumado.
Stu