何かを書き留める何か

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

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

【前回までの粗筋】
財布からお金が消えた。専門書は高い。

今日はTemplate Methodである。Javaでいう抽象クラスとインタフェースは何が違うのかが理解できていない気がしてきた。
インタフェースの場合はクラスの親子関係から離れて実装できるのだろうか…。

そして以下のコードはPythonである。そもそもJavaの考えをPythonに持ち込む必要があるのだろうか…どれが言語固有の概念でどれがオブジェクト指向プログラミングの概念なのか。

"""Template Method
1つのオペレーションにアルゴリズムの骨格を定義しておき、
その中のいくつかの部分についてはサブクラスでの定義に任せる。
アルゴリズムの構造を変えずにアルゴリズム内のあるステップを
サブクラスで再定義する。
"""

import abc

class AbstructDisplay(metaclass=abc.ABCMeta):
    """Abstruct Class
    アルゴリズムの不変部分はここで実装しておく"""
    @abc.abstractmethod
    def start(self):
        pass
    @abc.abstractmethod
    def output(self):
        pass
    @abc.abstractmethod
    def end(self):
        pass
    def display(self):
        self.start()
        for i in range(5):
            self.output()
        self.end()

class CharDisplay(AbstructDisplay):
    """Concrete Class
    具体的な動きを実装する"""
    def __init__(self, ch):
        self.__ch = ch
    def start(self):
        print('<<', end="")
    def output(self):
        print(self.__ch, end="")
    def end(self):
        print('>>', end="\n")

class StringDisplay(AbstructDisplay):
    """Alternative Concrete Class
    もう一つの具象サブクラス"""
    def __init__(self, string):
        self.__string = string
    def start(self):
        self.__printline()
    def output(self):
        print('|' + self.__string + '|')
    def end(self):
        self.__printline()
    def __printline(self):
        print('+', end="")
        print('-' * len(self.__string), end="")
        print('+', end="\n")
    

def main():
    """テスト函数"""
    c = CharDisplay('Ni!')
    c.display()
    s = StringDisplay('And now for something completely different')
    s.display()
    
if __name__ == '__main__':
    main()

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らしくプログラミングすればよいかよくわからなかったので先輩にオブジェクト指向(プログラミング)とは何か、と尋ねたところ「データ構造と函数が一体になったもの」という返答があった。そのときに感じた不安がこの一連の記事の執筆動機である。