本章は前回(http://ksk77.blogspot.com/2010/11/3-template-method.html)のTemplate Methodパターンの応用と考えると分かりやすい。応用方法は
- 『インスタンス作成』をnewではなくTemplate Methodとして実装する
ことで、何が嬉しいのかというと
- 『インスタンス作成』という機能の自由度が増え、サービスに合わせた柔軟な設計が可能になる
ことだ、というふうに理解しました。本書のIDカードの例もそうですが、
- サービス的な見方(IDカードを発行する)
- プログラム的な見方(new IDCard())
は乖離していることが多く、サービスを開発するたびにその都度実装していては大変なので、Factory Methodパターンは有用だなと思いますた。
逆に考えれば、全てのクラスがコンストラクタというメソッドを持っているからこそ、このデザインパターンが独立しているんでしょうね
--
いつも通り、pythonによる実装↓
実行結果
結城浩が使っています とむらが使っています 佐藤花子が使っています
ソースコード
factory.py
# -*- coding: utf8 -*-
class Factory:
def __init__(self): raise Exception("abstract class")
def createProduct(self, owner): raise NotImplementedError
def registerProduct(self, product): raise NotImplementedError
def create(self, owner):
product = self.createProduct(owner)
self.registerProduct(product)
return product
class Product:
def __init__(self): raise Exception("abstract class")
def use(self): raise NotImplementedError
idcard.py, 含main
#!/usr/bin/env python
# -*- coding: utf8 -*-
from framework import Factory, Product
class IDCardFactory(Factory):
def __init__(self): self.owners = []
def createProduct(self, owner):
idcard = IDCard(owner)
return idcard
def registerProduct(self, product): self.owners.append(product)
class IDCard(Product):
def __init__(self, owner): self.owner = owner
def use(self): print self.owner+u"が使っています"
def main():
factory = IDCardFactory() # Factory's instance
card1 = factory.create(u"結城浩") # Product's instance
card2 = factory.create(u"とむら") # Product's instance
card3 = factory.create(u"佐藤花子") # Product's instance
card1.use()
card2.use()
card3.use()
if __name__=='__main__': main()
0 件のコメント:
コメントを投稿