Subscribed unsubscribe Subscribe Subscribe

SE Can't Code

A Tokyo based Software Engineer. Not System Engineer :(

AbstractFactory

Python

先日よりデザインパターンの勉強会を始めました。

デザインパターンとは、先人ハッカーたちが繰り返し取り組んだ過去の知見を再利用しやすいようにパターン化したもので、GoFというエーリヒ・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディースの4人組が取り上げた23パターンを指します。 彼らをこう述べています。

[Design patterns] solve specific design problems and make object-oriented designs more flexible, elegant, and ultimately reusable. They help >designers reuse successful designs by basing new designs on prior experience. A designer who is familiar with such patterns can apply them >immediately to design problems without having to rediscover them.

(wikipedia引用)


同じ問題に取り組んだ場合、典型的に皆同じ解決法を用いるのでそいつをまとめてみたよ!ってことですね。

さて、第一回の勉強会ですが、23パターンあるテーマから「AbstractFactory」を選びました。基本的にデザインパターンJavaが有名なのですが、Javaの例を参考にしつつPythonでコードを書いて理解に落とし込んでみました。


AbstractFactoryってなんぞ?

直訳すると「抽象的な工場」となります。全然二つの単語が結びつかないですが、そんなこと無視して抽象的にイメージを表現すると「抽象的的な工場で、抽象的な部品を組み合わせて抽象的な製品をつくる」になります。抽象化という言葉はオブジェクト指向の世界なら必ず聞く言葉ですが、このパタ―ンでは具体的な実装部分より抽象部分とそのインターフェース(API)に注目し、製品を組み立てていきます。


# -*- coding: utf-8 -*-

# AbstractFactory
class Nabe:

    def __init__(self, pot=None):
        self.__pot = pot
        __pot = ""
        __soup = ""
        __protein = ""
        __vegetables = ""
        __other = ""

    def Soup(self, soup):
        self.__soup = soup

    def Prtein(self, protein):
        self.__protein = protein

    def Vegetables(self, vegetables):
        self.__vegetables = vegetables

    def Other(self, other):
        self.__other = other

    def show_nabe(self): 
        mizu = Mizudaki()
        print mizu.addPot()
        print mizu.addSoup()
        print mizu.addPrtein()
        print mizu.addVegetables()
        print mizu.addOther()



# our factory makes
class Mizudaki:

    def addPot(self):
        return "Mizudaki"

    def addSoup(self):
        return "Torigara"

    def addPrtein(self):
        return "Chicken"

    def addVegetables(self):
        return "Negi"

    def addOther(self):
        return "Itokon"


# client
if __name__ == "__main__":

    print("=======================")
    nabenabe = Nabe()
    nabenabe.show_nabe()

    print("=======================")


イメージを捉えやすくするために書いているだけなのでいろいろと突っ込みどころがあるうかと思いますが、大きく二つのクラスに分けています。 本来ならAbstractProduct、AbstractFactory、Product、Factoryと作るべきかと思いますが、簡易的にするためAbstractFactoryの中にAbstractProductを記述し、ProductとFactoryも同様としています。

Nabeクラスでは各フィールドを抽象化をしています(ついでにここに出力処理を書いてます)。Mizudakiは抽象化で定義されている内容を具体的に記載し、各部品を作成しています。具体的なFactoryを追加して、どんどんいろんな製品がこれを使えば作ることができます。


ポイントとしては、最後のclient分ですが、clientから具体的な部品部分を隠ぺいしています。つまり具体的な実装部分が今後変更されたとしても、client部分に触る必要はなく、これはこのAbstractFactoryのメリットとして挙げられます。 また逆にデメリット部分ですが、抽象部分のAbstractFactoryに新しい抽象部品が追加された場合、過去に作成した具体的な部品を軒並み変更する必要が出るということが挙げられるかと思います。





感想

んん、なんとなくわかったけれど、こいつってどういう場面で使うのだろうか。。ダミーコードと正規コードの差し替え場面とかなら、使えそうな気がする。。 今後の勉強会の課題としては、デザインパターンが実際の現場でどのように使われるのか、というところを意識して学んでいくことが挙げられますね。


参考

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

以上です。ありがとうございますた。

Remove all ads