早いものでもう第6章。今回はPrototypeパターンです。
第4章のFactory Methodパターン( http://ksk77.blogspot.com/2010/11/4-factory-method.html )に似ているのですが、大きく違うところが一点。
- 『生成』ではなく『コピー』
この違いのため、以下のように焦点が異なっています。
- 前回は作る側(Factory)に焦点を当てて生成のメソッド(factoryMethod)なんかを作っていた
- 今回は作られる側(Prototype)に焦点を当ててコピーを作るメソッド(createClone)なんかを作っている
こうやって自分なりの解釈を付けていきながら読み進めていこう。
以下、pythonでの実装。(と書くのも一々面倒なのでタイトルにpythonって書いておきました。) pythonではオブジェクトのコピーを copy モジュールに独立に用意しているので分かりやすいです。
なお、練習問題6-1を参考に、PrototypeにcreateClone()を実装してあります。
実行結果
"Hello, world." ~~~~~~~~~~~~~ ***************** * Hello, world. * ***************** ///////////////// / Hello, world. / /////////////////
ソースコード
framework.py
# -*- coding: utf8 -*- import copy class Manager: def __init__(self): self.__showcase = dict() def register(self, name, proto): self.__showcase[name] = proto def create(self, name): return copy.deepcopy(self.__showcase[name]) class Prototype: def use(self): raise NotImplementedError def createClone(self): return copy.deepcopy(self)
main.py
#!/usr/bin/env python # -*- coding: utf8 -*- from framework import Manager, Prototype class MessageBox(Prototype): def __init__(self, decochar): self.decochar = decochar def use(self, message): import sys for i in xrange(len(message)+3): sys.stdout.write(self.decochar) print self.decochar print "%c %s %c" % (self.decochar, message, self.decochar) for i in xrange(len(message)+3): sys.stdout.write(self.decochar) print self.decochar class UnderlinePen(Prototype): def __init__(self, ulchar): self.ulchar = ulchar def use(self, message): import sys print "\""+message+"\"" sys.stdout.write(" ") for i in xrange(len(message)): sys.stdout.write(self.ulchar) print " " def main(): # prepare manager = Manager() upen = UnderlinePen("~") mbox = MessageBox("*") sbox = MessageBox("/") manager.register("strong message", upen) manager.register("warning box", mbox) manager.register("slash box", sbox) # create p1 = manager.create("strong message") p1.use("Hello, world.") p2 = manager.create("warning box") p2.use("Hello, world.") p3 = manager.create("slash box") p3.use("Hello, world.") if __name__=='__main__': main()
0 件のコメント:
コメントを投稿