Factoryパターン(3) - Abstract Factory


Template MethodパターンをStrategyパターンに書き換えられるように、Factory MethodパターンをAbstract Factoryパターンに書き換える事が出来ます。

前回Pond(池)クラスを作りましたが、今度は陸上もシミュレーションする事になりました。

とは言っても、PondをHabitatに名前変更するだけです。早速、HabitatにTigerクラスとTreeクラスを渡してみましょう。

h = Habitat(10, Tiger, 1000, Tree)
pond.simulate_one_day()

ところで、ひとつ気になるのは、動物と植物の組み合わせです。

もし間違えると、虎が藻の中に生活する事になったり、樹の脇で魚がピチピチ跳ねる事になってしまいます。

そこで、Template Methodパターンの一種であるFactory Methodパターンから、Strategyパターンの一種であるAbstract Factoryパターンにスイッチしましょう。

class Habitat(object):
    def __init__(self, number_animals, number_plants, organism_factory):
        self.animals = []
        for i in xrange(number_animals):
            animal = organism_factory.new_animal("動物%d"%(i,))
            self.animals.append(animal)
        
        self.plants = []
        for i in xrange(number_plants):
            plant = organism_factory.new_plant("植物%d"%(i,))
            self.plants.append(plant)

class JunggleOrganismFactory(object):
    def new_animal(self, name):
        return Tiger(name)
    
    def new_plant(self, name):
        return Tree(name)

class PondOrganismFactory(object):
    def new_animal(self, name):
        return Duck(name)
    
    def new_plant(self, name):
        return WaterLily(name)