ファクトリモードの詳細な分析

  工場モード

        テイクアウトの食事は、ハンバーガーなどのメインの食事、軽食、飲み物の3種類から選択できます。必要な食品を選択して支払いが完了すると、注文が生成されます。
    または、車が必要な場合は、車の製造方法や車内の特定の実装に関係なく、工場から直接商品を受け取ることができます。
    
   利点:1。呼び出し元は、オブジェクトの名前を知っている限り、他の詳細情報を知る必要がない限り、オブジェクトを作成したいと考えています。  
                2.発信者として、製品の特定の実装をシールドします。発信者は、製品のインターフェースのみを気にします。

    短所

           1新しいタイプをシステムに追加する場合は、ファクトリクラスを変更し、必要な処理ロジックを追加する必要があります。これは、「開閉の原則」に違反します。
           2単純なファクトリパターンでは、すべての製品が同じファクトリによって作成されます。ファクトリクラスはヘビーデューティで、より複雑なビジネスロジック、具体的な製品
             、
             およびシステムセックスの柔軟性と拡張に深刻な影響を与える、ハイ間カップリングのファクトリクラスです。 ファクトリメソッドパターンは、この問題の良い解決策になる可能性があります。

           使用事例:

        1.ログレコーダー:レコードはローカルハードディスク、システムイベント、リモートサーバーなどに記録される場合があり、ユーザーはログを記録する場所を選択できます。   

        2.データベースへのアクセス。システムが最終的にどのタイプのデータベースを使用するかがユーザーにわからず、データベースが変更される可能性がある場合。
        3.サーバーに接続するフレームワークを設計するには、「POP3」、「IMAP」、「HTTP」の3つのプロトコルが必要です。これらの3つは、インターフェイスを一緒に実装するための製品クラスとして使用できます。

        拡張:「オープンクローズ原則」。いわゆる拡張のために開いて、変更のために閉じます

             ファクトリメソッドパターン:同じインターフェイスが異なるシリーズの製品を生成し、同じタイプの複数の異なるインスタンスが取得されます。
             ファクトリメソッドパターンでは、ファクトリ親クラスが製品オブジェクトを作成するためのパブリックインターフェイスの定義を担当し、ファクトリサブクラスが特定の製品オブジェクトの生成を担当します。これの目的は、製品クラスのファクトリへのインスタンス化を遅らせることです。サブクラス。つまり、ファクトリサブクラスは、インスタンス化する特定の製品クラスを決定するために使用されます。
             同じインターフェースを使用して、さまざまなことを処理することもできます。

             短所:新製品を追加するときは、新しい特定の製品カテゴリを作成し、対応する特定の工場カテゴリを提供する必要があります。システム内のカテゴリの数はペアで増加するため、システムの複雑さがある程度増加します。より多くのクラスが必要です。コンパイルして実行すると、システムに追加のオーバーヘッドが発生します。

    # 工厂模式:
     def create_shape(name):
        if name =='Circle':
            return Circle()
        elif name == 'Rectangle':
            return Rectangle()
        elif name == 'Triangle':
            return Triangle()
        elif name == 'Ellipse':
            return Ellipse()
        else:
            return None
 #   工厂方法模式:
 import math
 
#定义4个图形类,并且每一个图形都有一个可以计算面积的方法
class Circle:
    def Area(self,radius):
        return math.pow(radius,2)*math.pi
 
class Rectangle:
    def Area(self,longth,width):
        return 2*longth*width
 
class Triangle:
    def Area(self,baselong,height):
        return baselong*height/2
 
class Ellipse:
    def Area(self,long_a,short_b):
        return long_a*short_b*math.pi
 
#定义创建对象的工厂接口,因为python中并没有接口的概念,所以,这里打算通过“类的继承”加以实现
class IFactory:  #模拟接口
    def create_shape(self):  #定义接口的方法,只提供方法的声明,不提供方法的具体实现
        pass
 
class CircleFactory(IFactory): #模拟类型实现某一个接口,实际上是类的继承
    def create_shape(self, name):  #重写接口中的方法
        if name =='Circle':
            return Circle()
 
class RectangleFactory(IFactory): #模拟类型实现某一个接口,实际上是类的继承
    def create_shape(self, name):  #重写接口中的方法
        if name =='Rectangle':
            return Rectangle()
 
class TriangleFactory(IFactory): #模拟类型实现某一个接口,实际上是类的继承
    def create_shape(self, name):  #重写接口中的方法
        if name =='Triangle':
            return Triangle()
 
class EllipseFactory(IFactory): #模拟类型实现某一个接口,实际上是类的继承
    def create_shape(self, name):  #重写接口中的方法
        if name =='Ellipse':
            return Ellipse()
 
 
if __name__=='__main__':
    factory1=CircleFactory()
    factory2=RectangleFactory()
    factory3=TriangleFactory()
    factory4=EllipseFactory()
 
    circle=factory1.create_shape('Circle')
    circle_area=circle.Area(2)
    print(f'这是一个圆,它的面积是:{circle_area}')
 
    rectangle=factory2.create_shape('Rectangle')
    rectangle_area=rectangle.Area(2,3)
    print(f'这是一个长方形,它的面积是:{rectangle_area}')
 
    triangle=factory3.create_shape('Triangle')
    triangle_area=triangle.Area(2,3)
    print(f'这是一个三角形,它的面积是:{triangle_area}')
 
    ellipse=factory4.create_shape('Ellipse')
    ellipse_area=ellipse.Area(3,2)
    print(f'这是一个椭圆,它的面积是:{ellipse_area}')

    工場モード:

          一連のクラス(Circle、Rectangle、Ellipse、Triangleなど)には、多くの共通点があります。素人の用語では、一連のクラスです。ファクトリを使用し、ファクトリ作成関数を使用して特定のクラスを作成します。

    一連のクラス->ファクトリ->作成関数->特定のクラス

    ファクトリメソッドパターン:

           一連のクラス(Circle、Rectangle、Ellipse、Triangleなど)の場合、抽象ファクトリインターフェイスを使用してから、特定のクラスごとにファクトリクラスを記述し、各クラスに関数を作成します。

    一連のクラス->抽象ファクトリインターフェイス->一連に対応する複数のファクトリクラス->各クラスには作成関数があります->特定のクラス

    

概要:単純なファクトリモデルは一般的な契約サービスであり、作成する必要のあるクラスの数に関係なく、すべてファクトリによって完了されます。

          ファクトリ関数パターンは、カスタマイズされた1対1のサービスです。各ファクトリは特定のクラスしか作成できませんが、これらのファクトリは、一般的なファクトリで指定された原則
         (つまり、抽象ファクトリインターフェイスの作成方法)に一律に従います。

    では、抽象的なファクトリパターンとは何ですか?
    抽象ファクトリパターン(抽象ファクトリパターン)は、スーパーファクトリの周りに他のファクトリを作成することです。このスーパーファクトリーは他の工場のファクトリーとも呼ばれています。このタイプのデザインパターンは作成パターンであり、オブジェクトを作成するための最良の方法を提供します。

    シンプルな工場モデル:集中生産

    ファクトリメソッドモデル:分散型生産

    抽象ファクトリモデル:同じ一連の集中型生産、異なる一連の分散型生産(前の2つの組み合わせ)


   ファクトリメソッドと抽象ファクトリメソッドの比較
              ファクトリメソッドは、オブジェクトを作成するメソッドを開発しました。   
              抽象ファクトリメソッドは、1つ以上のメソッドを開いて、一連の関連オブジェクトを作成します。
              ファクトリメソッドは、継承とサブクラスを使用して、作成するオブジェクトを決定します。 。
              抽象通信メソッドが使用されます。コンポジションは、オブジェクトを作成するタスクを他のクラス
              コミュニティメソッドに委任
              して、一連の関連製品を作成するための製品抽象ファクトリメソッドを作成します。

抽象ファクトリモデルを完全に実装するには、「4つのステップ」戦略を参照してくださいhttps://blog.csdn.net/qq_27825451/article/details/84284681)。

import math
 
#定义一个“形状”的接口,里面定义一个面积的接口方法,只有方法的定义,并没有实现体
class IShape(object): 
    def Area(self):
        pass
 
#定义4个图形类,都是实现Ishape接口,并且每一个图形都有一个可以计算面积的方法,相当于重写接口方法
class Circle(IShape):
    def Area(self,radius):
        return math.pow(radius,2)*math.pi
 
class Rectangle(IShape):
    def Area(self,longth,width):
        return 2*longth*width
 
class Triangle(IShape):
    def Area(self,baselong,height):
        return baselong*height/2
 
class Ellipse(IShape):
    def Area(self,long_a,short_b):
        return long_a*short_b*math.pi

 

2. 2番目のステップは、カラーシリーズを再度定義することです。

#定义一个“颜色”的接口,里面定义一个颜色名称的接口方法,只有方法的定义,并没有实现体
class IColor(object): 
    def color(self):
        pass
 
#定义3个颜色类,都是实现IColor接口,并且每一个图形都有一个可以获取颜色名称的方法,相当于重写接口方法
class Red(IColor):
    def color(self,name):
        print(f'我的颜色是:{name}')
 
class Blue(IColor):
    def color(self,name):
        print(f'我的颜色是:{name}')
 
class Black(IColor):
    def color(self,name):
        print(f'我的颜色是:{name}')

3. 3番目のステップは、抽象ファクトリと各シリーズに対応するファクトリを定義することです。

class IFactory:  #模拟接口
    def create_shape(self):  #定义接口的方法,只提供方法的声明,不提供方法的具体实现
        pass
    def create_color(self):
        pass
 
#创建形状这一个系列的工厂
class ShapeFactory(IFactory): #模拟类型实现某一个接口,实际上是类的继承
    def create_shape(self, name):  #重写接口中的方法
        if name =='Circle':
            return Circle()
        elif name == 'Rectangle':
            return Rectangle()
        elif name == 'Triangle':
            return Triangle()
        elif name == 'Ellipse':
            return Ellipse()
        else:
            return None
 
#创建颜色这一个系列的工厂
class ColorFactory(IFactory): #模拟类型实现某一个接口,实际上是类的继承
    def create_color(self, name):  #重写接口中的方法
        if name =='Red':
            return Red()
        elif name =='Blue':
            return Blue()
        elif name =='Black':
            return Black()
        else:
            return None
 

 

注:ここでの抽象ファクトリは、「ファクトリメソッドパターン」の抽象ファクトリとは少し異なります。生成する必要のあるタイプが2つあるため、抽象ファクトリには2つの機能インターフェイスが必要です。生成「形状を生成する」と一つの「カラー」を、次いで工場実装するインターフェースで別々に書き換えます。

4. 4番目のステップは、ファクトリクラスを生成するクラスを定義することです。これは、抽象ファクトリパターンのコアです。

定义一个专门产生工厂的类
class FactoryProducer:
    def get_factory(self,name):
        if name=='Shape':
            return ShapeFactory()
        elif name=='Color':
            return ColorFactory()
        else:
            return None

注:このステップは、抽象ファクトリパターンの最も特徴的なものです。「単純ファクトリパターン」に従う場合は、ShapeFactoryファクトリクラスとColorFactoryクラスを使用して各シリーズを生成するため、3番目のステップに進むだけで済みます。個別にクラスのインスタンスは問題ありませんが、これは行いませんでした。しかし、新しいものを定義する

「ファクトリはクラスを生成します」を使用して、生成するクラスインスタンスを決定します。

総括する:

抽象ファクトリパターン(抽象ファクトリパターン)は、スーパーファクトリの周りに他のファクトリを作成することです。このスーパーファクトリーは他の工場のファクトリーとも呼ばれています。このタイプのデザインパターンは作成パターンであり、オブジェクトを作成するための最良の方法を提供します。(ここのFactoryProducerはスーパーファクトリーです)

抽象ファクトリパターンでは、インターフェイスは関連オブジェクトの作成を担当するファクトリであり、それらのクラスを明示的に指定する必要はありません。生成された各ファクトリは、ファクトリパターンに従ってオブジェクトを提供できます。
 

おすすめ

転載: blog.csdn.net/weixin_42322206/article/details/100087908