PythonでFactory Methodパターン

Factory Methodパターンを使うと,実際に作成するオブジェクトの種類や作成手順を隠蔽できます.
たとえば次の例だと,Counterオブジェクトが生成されるのか,それともCounterWithRealNumberオブジェクトが生成されるのかを,そのオブジェクトを利用する側では気にしなくてもよい.

#!/usr/bin/python

class Counter(object):
    def __init__(self):
        self.count = 0;
    def increment(self):
        self.count += 1;
    def getValue(self):
        return self.count;
class CounterWithRealNumber(Counter):
    def __init__(self):
        self.count = 0.0;

class CounterFactory(object):
    def create(cls, arg = "default"):
        if arg == "real_number":
            return CounterWithRealNumber();
        else:
            return Counter();

    create = classmethod(create);


if __name__ == '__main__':
    a = CounterFactory.create();
    b = CounterFactory.create("real_number");

    a.increment();
    b.increment();

    print "a.getValue() = " + str(a.getValue());
    print "b.getValue() = " + str(b.getValue());

で,実行結果.

a.getValue() = 1
b.getValue() = 1.0