Listing of doc/example-scripts/rosetta-singleton.tcl
Rosetta Example: Singleton
For details see https://rosettacode.org/wiki/Singleton
A Singleton Class
package req nx nx::Class create Singleton { # # We overload the system method "create". In the modified method we # save the created instance in the instance variable named # "instance" # :variable instance:object :public object method create {args} { return [expr {[info exists :instance] ? ${:instance} : [set :instance [next]]}] } }
Demonstrating the behavior in a shell:
Calling Singleton new
multiple times returns always the same object:
% expr {[Singleton new] eq [Singleton new]} 1
A Singleton Meta-class
Alternatively, we can follow a more generic approach and define a
metaclass which allows one to define several application classes as
singletons. The metaclass has the most general metaclass nx::Class
as superclass. In contrary to the example obove, the create
method
is not defined as a class method, but it will be inherited to its
instances (to the application classes).
nx::Class create Singleton -superclass nx::Class { # # We overload the system method "create". In the modified method we # save the created instance in the instance variable named # "instance" # :variable instance:object :public method create {args} { return [expr {[info exists :instance] ? ${:instance} : [set :instance [next]]}] } }
Create an application class named Counter
as a singleton:
% Singleton create Counter
::Counter
Calling Counter new
multiple times returns always the same object:
% expr {[Counter new] eq [Counter new]} 1