Pythonは設計モードを実現する--03.抽象ファクトリモード(Abstract Factory Pattern)


抽象工場モデルと工場方法モデルの違いは,後者の1つの工場では1つの製品しか生産されず,前者は1つの工場で複数の製品を生産できることである.もちろん、これらの製品の間には関連があり、通常は全体の製品の一部であり、工場で製造された後、完全な製品に組み立てられています.ネット上でよく自動車を造って例を作ります:職場Aは車体を生産して、職場Bはドアを生産して、職場Cは車輪を生産して、工場はそれらを造った後に、1部の完全な自動車を得ました.
抽象工場モデルの利点は、製品クラスを異なるサブクラスに分割し、できるだけ単一の職責原則を満たすと同時に、それらを一つの工場に制約する「高集約」の良好なモデルである.
今回は、具体的なプロジェクトの例で実践していきます.基本的にすべてのインターネット会社は、必ず支払い機能(さもなくばどのようにお金を稼ぐか)を提供しなければならない.私たちの支払いを簡略化するには、ユーザーの支払い、返金、支払い状態の照会の3つの機能が含まれている.次に、3の機能の抽象インタフェースを定義します.
#       (     )
class UserPayFunction:
    def pay(self):
        pass


#     (     )
class RefundFunction:
    def refund(self):
        pass


#         (     )
class QueryPayFunction:
    def query(self):
        pass
社は通常、支付宝の支払いと微信の支払いの2つの方法があると仮定して、上の3つの機能はそれぞれ2つの実現があり、コードは以下の通りです.
#       ,   (    )
class AlipayUserPayFunction(UserPayFunction):
    def pay(self):
        print("         ")


#       ,    (    )
class WxpayUserPayFunction(UserPayFunction):
    def pay(self):
        print("          ")


#     ,   (    )
class AlipayRefundFunction(RefundFunction):
    def refund(self):
        print("      ")


#     ,    (    )
class WxpayRefundFunction(RefundFunction):
    def refund(self):
        print("       ")


#         ,   (    )
class AlipayQueryPayFunction:
    def query(self):
        print("         ")


#         ,    (    )
class WxpayQueryPayFunction:
    def query(self):
        print("        ")
では、3つの機能を生産する抽象的な工場と、2つの実装工場を定義します.
#       
class AbstractPaymentFactory:
    def createUserPayFunction(self):
        pass

    def createRefundFunction(self):
        pass

    def createQueryPayFunction(self):
        pass


#        
class AlipayPaymentFactory:
    def createUserPayFunction(self):
        return AlipayUserPayFunction()

    def createRefundFunction(self):
        return AlipayRefundFunction()

    def createQueryPayFunction(self):
        return AlipayQueryPayFunction()


#       
class WxpayPaymentFactory:
    def createUserPayFunction(self):
        return WxpayUserPayFunction()

    def createRefundFunction(self):
        return WxpayRefundFunction()

    def createQueryPayFunction(self):
        return WxpayQueryPayFunction()
最後に、シミュレーションシーン呼び出し:
if __name__ == '__main__':
    paymentFactory1 = AlipayPaymentFactory()
    paymentFactory2 = WxpayPaymentFactory()

    userPayFunction1 = paymentFactory1.createUserPayFunction()
    refundFunction1 = paymentFactory1.createRefundFunction()
    queryPayFunction1 = paymentFactory1.createQueryPayFunction()

    userPayFunction2 = paymentFactory2.createUserPayFunction()
    refundFunction2 = paymentFactory2.createRefundFunction()
    queryPayFunction2 = paymentFactory2.createQueryPayFunction()

    userPayFunction1.pay()
    refundFunction1.refund()
    queryPayFunction1.query()

    userPayFunction2.pay()
    refundFunction2.refund()
    queryPayFunction2.query()
の実行結果は次のとおりです.
         
      
         
          
       
        

まとめ:
抽象工場モデルの利点:各製品クラスの職責を単一にし、工場クラスを非常に拡張しやすくすることができます.例えば、例に「銀聯支払い」を追加するには、いくつかのクラスを増やすだけでいいです.
抽象工場モデルの欠点:各製品が1つの工場に組み立てられ、製品の種類を増やす場合(例えば一部の返金機能を増やす)、変更は非常に大きく、すべてのサブ工場が修正しなければならない.したがって抽象工場モデルは製品ファミリーが安定しており、頻繁に変動しない場合に適している.
また,上記から,製品が細分化された後は単一の職責原則を満たすが,クラスデータの成長が速いことがわかる.後で戦略モデルを紹介する際、簡単な工場モデルと組み合わせてこの方法を簡略化します.