Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Паттерны проектирования 5.2

Vitaly Shlyaga
December 07, 2012

Паттерны проектирования 5.2

Паттерн Одиночка.

Vitaly Shlyaga

December 07, 2012
Tweet

More Decks by Vitaly Shlyaga

Other Decks in Education

Transcript

  1. Переменные класса class ClassVariableTester @@class_count = 0 def initialize @instance_count

    = 0 end def increment @@class_count = @@class_count + 1 @instance_count = @instance_count + 1 end def to_s "class_count: #{@@class_count} instance_count: #{@instance_count}" end end c1 = ClassVariableTester.new c1.increment c1.increment puts("c1: #{c1}") c2 = ClassVariableTester.new puts("c2: #{c2}")
  2. Методы класса class SomeClass def self.class_level_method puts('hello from the class

    method') end end class SomeClass def SomeClass.class_level_method puts('hello from the class method') end end SomeClass.class_level_method
  3. Одиночка class SimpleLogger attr_accessor :level ERROR = 1 WARNING =

    2 INFO = 3 def initialize @log = File.open("log.txt", "w") @level = WARNING end def error(msg) @log.puts(msg) @log.flush end def warning(msg) @log.puts(msg) if @level >= WARNING @log.flush end def info(msg) @log.puts(msg) if @level >= INFO @log.flush end end logger = SimpleLogger.new logger.level = SimpleLogger::INFO logger.info('1') logger.info('2')
  4. Одиночка class SimpleLogger # ... @@instance = SimpleLogger.new def self.instance

    return @@instance end end logger1 = SimpleLogger.instance logger2 = SimpleLogger.instance SimpleLogger.instance.info('123') SimpleLogger.instance.warning('234') SimpleLogger.instance.error('345')
  5. Одиночка-3 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
  6. Одиночка-3 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.info('1')
  7. Одиночка-4 require 'singleton' class Manager include Singleton def manage_resources puts("MANAGER")

    end end m = Manager.new # private method 'new' called for Manager:Class
  8. Одиночка-4 require 'singleton' class Manager include Singleton def manage_resources puts("MANAGER")

    end end class Manager public_class_method :new end m = Manager.new a_second_logger = ClassBasedLogger.clone a_second_logger.error('123')
  9. Одиночка-5 Не используйте как глобальную переменную. Не создавайте слишком много.

    Не рассказывайте о них никому. При тестировании используйте двойников.
  10. Задача 2 Создать классы EngInflections и RusInflections с помощью паттерна

    одиночка. В них разместить код, который реализует подстановку окончания к английским и русским словам. Английская версия принимает на вход число и существительное и выдаёт существительное с правильным окончанием. Русская — принимает число и варианты слова и выдаёт правильный вариант.