今日の勉強

具体的な生成方法を知らなくても、Factoryに生成してもらうことで、抽象的に扱えるようにするもの。

# factory method pattern

# factory class
class Factory
  def create(owner)
    p = create_product(owner)
    register_product(p)
    p
  end
  
  def create_product(owner)
    raise 'called abstract create_product method'
  end
  def register_product(p)
    raise 'called abstract register_product method'
  end
end

# IDCard class
class IDCard
  def initialize(owner)
    puts "make card of #{owner}"
    @owner = owner
  end
  
  def use
    puts "use card of #{owner}"
  end
  
  attr_reader :owner
end

# IDCardFactory class
class IDCardFactory < Factory
  def initialize
    @owners = []
  end
  def create_product(owner)
    IDCard.new(owner)
  end
  
  def register_product(p)
    @owners << p
  end
  
  attr_reader :owners
end

# main
factory = IDCardFactory.new
card1 = factory.create("aaa")
card2 = factory.create("bbb")
card3 = factory.create("ccc")
card1.use
card2.use
card3.use

サンプルのまんま。もうちょっとRubyらしく書きたい。