デザインパターン。
何となくデザインパターンを復習。すっかり忘れてしまっていて悲しい。
とりあえず、こちらで公開されているAdapterパターン、Singletonパターンを自分なりに書き直してみた。
Adapterパターン
継承を使った場合
class Banner def initialize(str) @str = str end def show_with_paren puts("(#{@str})") end def show_with_aster puts("*#{@str}*") end end class PrintBanner < Banner alias print1 show_with_paren alias print2 show_with_aster end pb = PrintBanner.new('Hello!') pb.print1 pb.print2
委譲を使った場合
require 'forwardable' class Banner def initialize(str) @str = str end def show_with_paren puts("(#{@str})") end def show_with_aster puts("*#{@str}*") end end class PrintBanner extend Forwardable def initialize(str) @banner = Banner.new(str) end def_delegator :@banner, :show_with_paren, :print1 def_delegator :@banner, :show_with_aster, :print2 end pb = PrintBanner.new('Hello!') pb.print1 pb.print2
結果。
(Hello!) *Hello!*
Singletonパターン
require 'singleton' class SingletonSample include Singleton end # コンストラクタはprivateなのでインスタンスを # 取得するにはinstanceメソッドを使用する sin1 = SingletonSample.instance sin2 = SingletonSample.instance p sin1 == sin2 p sin1.object_id p sin2.object_id begin sin3 = SingletonSample.new rescue => err puts(err) end
結果。
true 21612680 21612680 private method `new' called for SingletonSample:Class