Ruby/Design Patterns/Singletons

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск

Содержание

Classes as Singletons

class ClassBasedLogger
  ERROR = 1
  WARNING = 2
  INFO = 3
  @@log = File.open("log.txt", "w")
  @@level = WARNING
  def self.error(msg)
    @@log.puts(msg)
    @@log.flush
  end
  def self.warning(msg)
    @@log.puts(msg) if @@level >= WARNING
    @@log.flush
  end
  def self.info(msg)
    @@log.puts(msg) if @@level >= INFO
    @@log.flush
  end
  def self.level=(new_level)
    @@level = new_level
  end
  def self.level
    @@level
  end
end
ClassBasedLogger.level = ClassBasedLogger::INFO
ClassBasedLogger.info("A")
ClassBasedLogger.warning("B")
ClassBasedLogger.error("C")



Define a singleton method, one that is tied to a single object

class Singleton
end
s = Singleton.new
def s.handle
  puts "I"m a singleton method!"
end
s.handle # => I"m a singleton method!



define class methods by using a class within a class"s singleton class like the code

class Area
  class << self
    def rect( length, width, units="inches" )
      area = length*width
      printf( "The area of this rectangle is %.2f %s.", area, units )
      sprintf( "%.2f", area )
    end
  end
end
Area.rect(10, 10) # The area of this rectangle is 100.00 inches.=> "100.00"



include Singleton

require "singleton"
class Manager
  include Singleton
  def manage_resources
    puts("I am managing my resources")
  end
end
m = Manager.new



Modules as Singletons

module ModuleBasedLogger
  ERROR = 1
  WARNING = 2
  INFO = 3
  @@log = File.open("log.txt", "w")
  @@level = WARNING
  def self.error(msg)
    @@log.puts(msg)
    @@log.flush
  end
end
ModuleBasedLogger.error("Computer wins chess game.")



Singleton a class

class MyLogger
  private_class_method :new
  @@logger = nil
  def MyLogger.create
    @@logger = new unless @@logger
    @@logger
  end
end
puts MyLogger.create.id
puts MyLogger.create.id