何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

Pythonで頑張る『Java言語で学ぶデザインパターン入門』【Factory Methodパターン】

【前回までの粗筋】
Chaplinの『Modern Times』と(Template|Factory) Methodはそんなに関係がない。

今日はFactory Methodである。Template Methodの考えをインスタンスに応用したもの。
インスタンス生成の枠組みだけを作り、詳細はサブクラスに投げる。

"""Factory Method
オブジェクトを生成するときのインタフェースだけ規定して、
実際にどのクラスをインスタンス化するかはサブクラスが決めるようにする。
"""

import abc

class Product(metaclass=abc.ABCMeta):
    """Product
    factorymethodが生成するオブジェクトの
    インタフェースを規定する"""
    @abc.abstractmethod
    def use(self):
        pass

class Factory(metaclass=abc.ABCMeta):
    """Creator
    Productクラスのインタフェースを実装する"""
    @abc.abstractmethod
    def _createproduct(self, owner):
        pass
    @abc.abstractmethod
    def _registerproduct(self, product):
        pass
    def create(self, owner):
        self.__p = self._createproduct(owner)
        self._registerproduct(self.__p)
        return self.__p


class IDCard(Product):
    """Concrete Priduct"""
    def __init__(self, owner):
        self.__owner = owner
        print(owner + 'のカードを作成します')
    def use(self):
        print(self.__owner + 'のカードを使います')
    def getowner(self):
        return self.__owner

class IDCardFactory(Factory):
    """Concrete Factory"""
    def __init__(self):
        self.__registed = []
    def _createproduct(self, owner):
        return IDCard(owner)
    def _registerproduct(self, product):
        self.__registed.append(product.getowner())

def main():
    factory = IDCardFactory()
    card1 = factory.create('金剛')
    card2 = factory.create('比叡')
    card3 = factory.create('榛名')
    card4 = factory.create('霧島')
    card1.use()
    card2.use()
    card3.use()
    card4.use()

if __name__ == '__main__':
    main()

会社において、Javaを使う機会があった。Javaと言えばオブジェクト指向プログラミングであり、どうやってJavaらしくプログラミングすればよいかよくわからなかったので先輩にオブジェクト指向(プログラミング)とは何か、と尋ねたところ「データ構造と函数が一体になったもの」という返答があった。そのときに感じた不安がこの一連の記事の執筆動機である。