Pythonは設計モードを実現する--03.抽象ファクトリモード(Abstract Factory Pattern)
3438 ワード
抽象工場モデルと工場方法モデルの違いは,後者の1つの工場では1つの製品しか生産されず,前者は1つの工場で複数の製品を生産できることである.もちろん、これらの製品の間には関連があり、通常は全体の製品の一部であり、工場で製造された後、完全な製品に組み立てられています.ネット上でよく自動車を造って例を作ります:職場Aは車体を生産して、職場Bはドアを生産して、職場Cは車輪を生産して、工場はそれらを造った後に、1部の完全な自動車を得ました.
抽象工場モデルの利点は、製品クラスを異なるサブクラスに分割し、できるだけ単一の職責原則を満たすと同時に、それらを一つの工場に制約する「高集約」の良好なモデルである.
今回は、具体的なプロジェクトの例で実践していきます.基本的にすべてのインターネット会社は、必ず支払い機能(さもなくばどのようにお金を稼ぐか)を提供しなければならない.私たちの支払いを簡略化するには、ユーザーの支払い、返金、支払い状態の照会の3つの機能が含まれている.次に、3の機能の抽象インタフェースを定義します.
まとめ:
抽象工場モデルの利点:各製品クラスの職責を単一にし、工場クラスを非常に拡張しやすくすることができます.例えば、例に「銀聯支払い」を追加するには、いくつかのクラスを増やすだけでいいです.
抽象工場モデルの欠点:各製品が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つの工場に組み立てられ、製品の種類を増やす場合(例えば一部の返金機能を増やす)、変更は非常に大きく、すべてのサブ工場が修正しなければならない.したがって抽象工場モデルは製品ファミリーが安定しており、頻繁に変動しない場合に適している.
また,上記から,製品が細分化された後は単一の職責原則を満たすが,クラスデータの成長が速いことがわかる.後で戦略モデルを紹介する際、簡単な工場モデルと組み合わせてこの方法を簡略化します.