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