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


「デザインモード」はクラスのいくつかのモードを作成することに関連して、共通の最も根本的な原則は:newオブジェクトを要らない!!!それなら、どうやって相手を手に入れるか教えてください.そう、「newを譲らないで、getオブジェクトのツールをください.ほかのことは気にしません」.これが工場モデルで、工場モデルは簡単で実用的なモデルで、Java世界で有名なspringのように、各フレームワークのあちこちに見られます.それ自体が大きな工場です.
ファクトリモードでは,ファクトリの役割は呼び出し者と被呼び出し者の関係を解くことであり,ファクトリモードはファクトリメソッドモードと単純ファクトリモードに分けられる.私たちはまず工場の方法モデルについて話して、次は現実的な栗を挙げます.
例えば、靴工場で靴と靴を生産しています.安利会社は電話で靴をくれました.恒大サッカーチームは電話で靴をくれました.靴工場は喜んで時間通りに納品しました.私たちはコードを使ってこのシーンをシミュレートして、靴工場は抽象的な工場で、その下の2つの職場--靴の職場と靴の職場--具体的な工場で、靴と靴はすべて製品で、安利と恒大はクライアントです.実装コードは次のとおりです.
#  ,  (     )
class Shoe:
    def walk(self):
        pass


#   (    )
class LeatherShoe(Shoe):
    def walk(self):
        print("     ,     ")


#   (    )
class SoccerShoe(Shoe):
    def walk(self):
        print("     ,      ")


#   ,  (    )
class ShoeFactory:
    def make_shoe(self):
        pass


#     (    )
class LeatherShoeFactory(ShoeFactory):
    def make_shoe(self):
        return LeatherShoe()


#     (    )
class SoccerShoeFactory(ShoeFactory):
    def make_shoe(self):
        return SoccerShoe()


#        
def anli_call():
    factory = LeatherShoeFactory()
    for i in range(3):
        shoe = factory.make_shoe()
        shoe.walk()


#        
def hengda_call():
    factory = SoccerShoeFactory()
    for i in range(3):
        shoe = factory.make_shoe()
        shoe.walk()


if __name__ == '__main__':
    anli_call()
    hengda_call()

ここでシミュレーション安利と恒大はそれぞれ3足の靴を注文し、運行結果は以下の通りである.
     ,     
     ,     
     ,     
     ,      
     ,      
     ,      
上記の例の各具体的な工場は1つの製品しか生産していません.この靴工場は牛が追い詰められていると仮定して、1つの職場ではどんな靴でも生産することができます.私たちは2つのサブ工場を除いて、父の工場をこのように変更しました.
#   ,  (    )
class ShoeFactory:
    def make_shoe(self, name):
        if name == "LeatherShoe":
            return LeatherShoe()
        elif name == "SoccerShoe":
            return SoccerShoe()
        else:
            return None
お客様のアプローチを次のように変更します.
#        
def anli_call():
    factory = ShoeFactory()
    for i in range(3):
        shoe = factory.make_shoe("LeatherShoe")
        shoe.walk()


#        
def hengda_call():
    factory = ShoeFactory()
    for i in range(3):
        shoe = factory.make_shoe("SoccerShoe")
        shoe.walk()
の運転結果は、上記と同様に、単純ファクトリモードと呼ばれています.単純ファクトリモデルはファクトリメソッドモデルコードに比べて複雑度が低下するが,製品を増やすたびにファクトリクラスを修正し,拡張性が悪い.
読者は、これは何なのか、こんなに複雑で、私は何行かのコードをnewしていくつかのオブジェクトを循環して終わります.はい、例では、このような簡単なエンティティオブジェクトはファクトリモードを必要としません.例を挙げると、「ファクトリ」の概念を体現しているからです.正直に言うと、私は本当にプロジェクトで工場モデルを使っていません.spring対bean対管理、jsonシーケンス化生成単例クラスなど、フレームワークの中でその出現を見ただけです.フレームワークを書くときにしか必要ないような気がしますが、ビジネスコードは行動クラスが多く、ポリシーモデルが多いのですが、そういえば工場モデルで行動クラスを管理できるのではないでしょうか.後でやってみます.
次は私の気持ちです.
工場と製品の間には弱いつながりがあり、上記の例の靴工場を靴生産に変更しても、全く問題はないので、工場モデルには良い命名規則が必要です.さらにpythonは弱い言語タイプで抽象的な概念もなく、サブクラスを制約するのは難しいので、工場を設計するときは必ずクラス名をはっきりさせ、呼び出し者にどんな製品が得られるか一目で分かるようにしなければならない.