FactoryMethod その4

今回は動的にFactoryを生成しています。
るびまの添削記事からパクりました。

module FactoryMethod
  class IDCard
    def initialize(str)
      @owner = str
    end
    def use
      "#{@owner}のカードを使います"
    end
  end
  class Factory
    def create(str)
      create_product(str)
    end
    def self.define(&block)
      c = Class.new(Factory)
      c.module_eval(&block)
      c.new
    end
    def self.product(klass)
      define_method(:create_product) { |str| klass.new str }
    end
  end
end

include FactoryMethod
fac = Factory.define {
  product IDCard
}
card = fac.create("gorou")
puts card.use

動的にするとRubyらしさが漂ってきます。
使いどころが難しいですが、楽しいですね。