# Prototype パターン # # Java言語で学ぶデザインパターンと同様の例題をRubyで記述した。 # # coded by Takehiro Kaga # # (1)warning boxとslash boxは同じクラスMessageBoxから生成したインスタンスです # もし、インスタンスごとにクラスが必要だとクラスの数が多くなりすぎる場合があるでしょう # 本パターンによりクラス数の増大を避けることができます # (2)図形エディタのようにユーザ操作により作った図形を表すインスタンスと同じものを # 作りたい場合などに使うことができます # (3)クラスManagerには生成のための具体的なクラス名は埋め込まれていないのでフレームワーク # パッケージとして汎用的に使うことができます # class Manager # インスタンスの複製を行う def initialize @hash = Hash.new end def register(name, product) # productで示すインスタンスに名前nameを付けて登録する @hash[name] = product end def create(name) product = @hash[name] # 名前nameで複製するインスタンスを指定している return product.createClone # createCloneがConcreatePrototypeとのインターフェイスである end # これを明示するにはRubyではドキュメントなどに工夫必要 end class MessageBox # ConcreatePrototype def initialize(decochar) @decochar = decochar end def use(string) (string.length + 4).times do print @decochar end puts "" puts @decochar + " " + string + " " + @decochar (string.length + 4).times do print @decochar end puts "" end def createClone product = self.clone product end end class UnderlinePen # ConcreatePrototype def initialize(ulchar) @ulchar = ulchar end def use(string) puts "\"" + string + "\"" (string.length + 2).times do print @ulchar end end def createClone product = self.clone product end end manager = Manager.new mbox = MessageBox.new("*") manager.register("warning box", mbox) sbox = MessageBox.new("/") manager.register("slash box", sbox) upen = UnderlinePen.new("~") manager.register("strong message", upen) p1 = manager.create("warning box") p1.use("Hello, world!") puts "" puts "" p2 = manager.create("slash box") p2.use("Hello world!") puts "" puts "" p3 = manager.create("strong message") p3.use("Hello world!")