Site icon imageTomoMemo.dev

Memo on programming. Provided by Tomo with passion.

Pythonで学ぶデザインパターン[Abstract Factory]

Icon in a callout block
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!

Powered by Tomo with passion.