Python 100Days Challenge Day16
Abstract Factory(抽象ファクトリー)とは、工場(Factorty)を作るためのパターン。
抽象ファクトリーパターンの概要
抽象ファクトリーパターンは、「工場(ファクトリー)」を作るためのパターン。
抽象ファクトリーはいわゆる「いろんな種類の工場」を作る。
プログラムを作るとき、たくさんの似たようなオブジェクト(例:動物、車、家)を作るときがある。これらのオブジェクトを作る方法が変わると、コード全体を修正するという非常に面倒なことが出てくる。
そこでこのAbstract Factoryパターン。
異なる種類のオブジェクトを作る複数の工場を使って、オブジェクトの作成方法を統一する。
では車を例に、ポルシェ、ランボルギーニ、メルセデスベンツをつくるためのAbstract Factoryパターンを考えてみる。
基本構成は抽象クラス→具体クラスの順番。
それでは基本構文で見ていく。
基本構文
まずは車を表す抽象クラスを定義。具体的な車のクラス(以下参照)が持つべきメソッドを宣言する。
class Car:
def drive(self):
pass
具体的な車のクラス、ポルシェ、ランボルギーニ、メルセデスベンツの具体的なクラスを定義する。これらはCar classを継承してdriveメソッドを実装する。
class Porche(Car):
def drive(self):
return "Driving a Porche!"
class Lamborghini(Car):
def drive(self):
return "Driving a Lamborghini!"
class MercedesBenz(Car):
def drive(self):
return "Driving a Mercedes-Benz!"
そしてAbstract Factory classを定義する。このクラスでは具体的な工場が持つべきメソッドを宣言する。
class CarFactory:
def create_car(self):
pass # ここにはまだ何もない、という意味。
車を作成するメソッドはサブクラスで実装する。↓(車毎の具体的な工場クラス)
最後は具体的な工場クラス、ポルシェ、ランボルギーニ、メルセデスベンツを作る車毎の具体的な工場クラスを定義。これらはCarFactoryクラスを継承してcreate_carメソッドを実装する。
class PorcheFactory(CarFactory):
def create_car(self):
return Porche()
class LamborghiniFactory(CarFactory):
def create_car(self):
return Lamborghini()
class MercedesBenzFactory(CarFactory):
def create_car(self):
return MercedesBenz()
では、作成された車を運転してみる
def main():
# インスタンス化して、各工場を作成する
porche_factory = PorcheFactory()
lamborghini_factory = LamborghiniFactory()
mercedes_benz_factory = MercedesBenzFactory()
# インスタンス化された工場で車を作る
car_porsche = porche_factory.create_car()
car_lamborghini = lamborghini_factory.create_car()
car_mercedes_benz = mercedes_benz_factory.create_car()
# 車を運転する
print(car_porsche.drive())
print(car_lamborghini.drive())
print(car_mercedes_benz.drive())
# このファイルが直接実行されたときだけ、main関数を呼び出す
if __name__ == "__main__":
main()
コードの全体像
class Car:
def drive(self):
pass
class Porche(Car):
def drive(self):
return "Driving a Porche!"
class Lamborghini(Car):
def drive(self):
return "Driving a Lamborghini!"
class MercedesBenz(Car):
def drive(self):
return "Driving a Mercedes-Benz!"
class CarFactory:
def create_car(self):
pass
class PorcheFactory(CarFactory):
def create_car(self):
return Porche()
class LamborghiniFactory(CarFactory):
def create_car(self):
return Lamborghini()
class MercedesBenzFactory(CarFactory):
def create_car(self):
return MercedesBenz()
def main():
# 各工場を作成する
porche_factory = PorcheFactory()
lamborghini_factory = LamborghiniFactory()
mercedes_benz_factory = MercedesBenzFactory()
car_porsche = porche_factory.create_car()
car_lamborghini = lamborghini_factory.create_car()
car_mercedes_benz = mercedes_benz_factory.create_car()
# 車を運転する
print(car_porsche.drive())
print(car_lamborghini.drive())
print(car_mercedes_benz.drive())
if __name__ == "__main__":
main()
>
Driving a Porche!
Driving a Lamborghini!
Driving a Mercedes-Benz!