Python

Python デザインパターンを学ぶ Factoryパターン

概要

Factoryパターン(ファクトリパターン)は、オブジェクトの生成プロセスに抽象化されたレイヤーを導入する役割を果たす。複数の型のオブジェクトを構築するための共通のインターフェイスとして機能する。これは、オブジェクト作成を組織的かつ簡単にテスト可能な状態で管理するために有用だ。さらに、オブジェクトの要求される性質に関するいくつかの情報に基づいて、どのタイプのオブジェクトを構築するかを識別することができる場合がある。

このデザインパターンを実装する方法はたくさんある。例えば「Factory Methodパターン」という、わかりやすい実装がある。

このパターンは、共通の親を持つ複数の型のオブジェクトを返す場合に便利だ。ファクトリは親クラスのスタティックメソッドとして実装され、予想される型に関するいくつかの情報(ファクトリメソッドへの引数として渡される)に基づいて、子クラスのオブジェクトを返すことができる。

ファクトリが共通の親クラスを持たないオブジェクトを返すことが期待される場合、ファクトリは独立した関数として、または独立した ファクトリのクラス内に簡単に実装できる。

実装例

from __future__ import generators
import random


class Base(object):

    @staticmethod
    def create_subclass(name):
        for subclass in Base.__subclasses__():
            if subclass.__name__ == name:
                return subclass()

        return False


class TypeA(Base):
    pass


class TypeB(Base):
    pass


def get_subclass_name(base):

    types = base.__subclasses__()
    return random.choice(types).__name__


if __name__ == '__main__':

    for i in range(10):
        subclass_name = get_subclass_name(base=Base)
        subclass = Base.create_subclass(name=subclass_name)
        print(type(subclass).__name__)