59.2.7. Singleton

všichni za jednoho, jeden za všechny

Ensure a class has only one instance, and provide a global point to access it.

V standardní instalaci knihoven je i implementace vzoru Singleton.

Avšak moduly mohou být také použity jako singleton objekty. Modul je v Ruby implementován jako objekt. Funkce modulu jsou implementovány jako metody instance objektu modul, a stav modulu je implementován jako proměnné instance objektu modul. Potom můžeme předa odkaz na modul stejně, jako odkaz na jiný objekt.

Singleton můžeme vytvořit za běhu programu. Můžeme to udělat například takto

MyObject = Object.new
def MyObject.foo; ...; end
def MyObject.bar; ...; end

nebo

MyObject = Object.new
class && MyObject
    def foo; ...; end
    def bar; ...; end
end

Definování funkcí modulu je jen komplikovaná cesta definováni metod singletonu. Například

module Mod
    def jedna; end
    def dve; end
    module_function :jedna, :dve
end

je jen zkratka pro

Mod = Module.new
class && Mod
    def jedna; end
    def dve; end
end
module Mod
    private
    def jedna; end
    def dve; end
end
class SingletonClass

  private_class_method :new

     def SingletonClass.create(*args, &block)
        @@singleton = new(*args, &block) unless @@singleton    
        return @@singleton
     end
end
require 'singleton'

class Singltn
  include Singleton

  def initialize
    raise NotImplementedError
  end;
end;

x = Singltn.instance;

Sengleton podle C2 je vytvořen technologií Mixing. Instance singletonu se nevytvářejí voláním metody .new ale voláním .instance

# $Id: singleton1.ses,v 1.1 2003/11/19 23:54:35 radek Exp $
require 'singleton'
true
class SClass
    include Singleton
end
SClass

Licence Creative Commons
Tento dokument Ruby, jehož autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .