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