Factoryパターン(3) - Abstract Factory
- Factoryパターン(1) - Factory Method
- Factoryパターン(2) - 引数にクラスを渡すFactory Method
- Factoryパターン(3) - Abstract Factory
- Factoryパターン(4) - 引数にクラスを渡す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)