2010年11月14日日曜日

第4章 Factory Methodパターン : インスタンス作成をサブクラスにまかせる



本章は前回(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 件のコメント:

コメントを投稿