ホームページ >バックエンド開発 >Python チュートリアル >シンプルなファクトリーパターンのPythonバージョンの紹介

シンプルなファクトリーパターンのPythonバージョンの紹介

黄舟
黄舟オリジナル
2017-10-17 10:25:341993ブラウズ

この記事では主にPython版のシンプルなファクトリパターンを詳しく紹介しますので、興味のある方は参考にしてみてください

シンプルなファクトリパターンとは何ですか?

ファクトリパターンには非常に鮮やかな説明があります。オブジェクトを作成するクラスは工場のようなもので、作成する必要があるオブジェクトは製品です。製品は工場で加工され、製品を使用する人は製品がどのように製造されるかを気にする必要はありません。ソフトウェア開発の観点から見ると、これによりモジュール間の結合が効果的に減少します。
単純なファクトリの機能は、クライアントがこのオブジェクトがどの特定のサブクラスに属しているかを知る必要なく、オブジェクトをインスタンス化することです。単純なファクトリによってインスタンス化されたクラスは、同じインターフェイスまたは基本クラスを持ちます。サブクラスが比較的固定されており、拡張する必要がない場合は、単純なファクトリを使用できます。たとえば、データベース作成ファクトリは、単純なファクトリのアプリケーションです。単純なファクトリを使用する利点は、ユーザーがパラメータに従って対応するクラス インスタンスを取得できること、クラスの直接インスタンス化が回避されること、およびインスタンス化可能な型が減少することです。新しいタイプが追加された場合、ファクトリを変更する必要があることが判明しました。これは、OCP (オープンクローズ原則) の原則に準拠していません。単純なファクトリは、生成されるすべての型を知っている必要があるため、サブクラスが多すぎる場合、またはサブクラスのレベルが多すぎる場合の使用には適していません。

単純なファクトリ パターンの実装

以下の「Dahua デザイン パターン」の例を考えてみましょう:

タイトル: 任意のオブジェクト指向言語を使用して、電卓コンソール プログラムを実装します。結果を取得するには、2 つの数字と演算記号を入力する必要があります。

質問分析:

プログラムは、(1) 保守可能、(2) 再利用可能、(4) 拡張可能である必要があります。

保守可能: これは、コードが 1 か所で変更された場合、連鎖反応を引き起こしたり、他の場所に影響を与えたりすることがないことを意味します。
再利用可能: 反復的なコードを最小限に抑えます。
拡張可能: 新しい機能や新しいビジネスを拡張したい場合は、既存のクラスやロジックに影響を与えることなく、新しいクラスを追加するだけで済みます。プラグインアプリケーション。
オブジェクト指向のキーポイント:
オブジェクト指向の 3 つの主要な特徴: カプセル化、継承、ポリモーフィズム。
カプセル化、継承、ポリモーフィズムを通じてプログラムの結合を削減します。
ビジネスロジックとインターフェースロジックは分離されています。

クラス構造図:


コードの実装:

まず、ビジネスの変化しやすい部分を把握します。このアプリケーションでは2つの数値の演算結果を計算する必要があるため、どのような演算を行うかは変更されやすい部分です。たとえば、今は加算、減算、乗算、除算の演算のみを実装し、後で root 演算や剰余演算を追加したいとします。では、この需要によってもたらされる変化にどう対処するか。プログラムを設計するときは、プログラムの保守性、拡張性、コードの再利用性、柔軟性などを考慮する必要があります。


2. たとえば、この算術ユニットには、加算、減算、乗算、除算の 4 つの演算しかありません。まず、Operation クラスを作成します。このクラスは、主にユーザーが入力した値を受け入れるさまざまな特定の演算クラス (加算、減算、乗算、除算) の親クラスです。クラスは次のとおりです:



class Operation(): 
  def __init__(self,NumberA=0,NumberB=0): 
    self.NumberA = NumberA 
    self.NumberB = NumberB 
 
  def GetResult(self): 
    pass

3 次に、Add、Sub、Mul、p という特定の操作クラスがあります。これらはすべて Operation クラスを継承し、getResult() メソッドをオーバーライドします。このように、ポリモーフィズムを使用してさまざまなビジネス ロジックの結合を減らすことができ、1 つの操作クラスを変更しても他の操作クラスに影響を与えることはありません。特定のクラスのコードは次のとおりです:



class AddOp(Operation): 
  def GetResult(self): 
    return self.NumberB + self.NumberA 
 
class MinusOp(Operation): 
  def GetResult(self): 
    return self.NumberA - self.NumberB 
 
class MultiOp(Operation): 
  def GetResult(self): 
    return self.NumberA * self.NumberB 
 
class pideOp(Operation): 
  def GetResult(self): 
    try: 
      return 1.0*self.NumberA / self.NumberB 
    except ZeropisionError: 
      raise

4. では、どの演算を使用するかを電卓に知らせるにはどうすればよいでしょうか。言い換えれば、どの特定の操作クラスをインスタンス化する必要があるかということです。サブ?マル?ぷ?現時点では、特定のインスタンスを作成するプロセスを実行するために別のクラスを使用することを検討する必要があります。このクラスはファクトリ クラスです。次のように:



class OperationFatory(): 
  def ChooseOperation(self,op): 
    if op == '+': 
      return AddOp() 
    if op == '-': 
      return MinusOp() 
    if op == '*': 
      return MultiOp() 
    if op == '/': 
      return pideOp()

5. このように、ユーザーは演算子を入力するだけで、ファクトリ クラスは適切なインスタンスを作成し、ポリモーフィズムを通じて演算結果を実現できます。親クラス。クライアント コードは次のとおりです:



if __name__ == '__main__': 
  ch = '' 
  while not ch=='q':  
    NumberA = eval(raw_input('Please input number1: ')) 
    op = str(raw_input('Please input the operation: ')) 
    NumberB = eval(raw_input('Please input number2: ')) 
    OPFactory = OperationFatory() 
    OPType = OPFactory.ChooseOperation(op) 
    OPType.NumberA = NumberA 
    OPType.NumberB = NumberB 
    print 'The result is:',OPType.GetResult() 
    print '\n#-- input q to exit any key to continue' 
    try: 
      ch = str(raw_input()) 
    except: 
      ch = ''

完全バージョンのコードは次のとおりです:


# -*-coding:UTF-8-*-  
from abc import ABCMeta,abstractmethod 
 
class Operation(): 
  def __init__(self,NumberA=0,NumberB=0): 
    self.NumberA = NumberA 
    self.NumberB = NumberB 
 
  def GetResult(self): 
    pass 
 
class AddOp(Operation): 
  def GetResult(self): 
    return self.NumberB + self.NumberA 
 
class MinusOp(Operation): 
  def GetResult(self): 
    return self.NumberA - self.NumberB 
 
class MultiOp(Operation): 
  def GetResult(self): 
    return self.NumberA * self.NumberB 
 
class pideOp(Operation): 
  def GetResult(self): 
    try: 
      return 1.0*self.NumberA / self.NumberB 
    except ZeropisionError: 
      raise 
 
class OperationFatory(): 
  def ChooseOperation(self,op): 
    if op == '+': 
      return AddOp() 
    if op == '-': 
      return MinusOp() 
    if op == '*': 
      return MultiOp() 
    if op == '/': 
      return pideOp() 
 
if __name__ == '__main__': 
  ch = '' 
  while not ch=='q':  
    NumberA = eval(raw_input('Please input number1: ')) 
    op = str(raw_input('Please input the operation: ')) 
    NumberB = eval(raw_input('Please input number2: ')) 
    OPFactory = OperationFatory() 
    OPType = OPFactory.ChooseOperation(op) 
    OPType.NumberA = NumberA 
    OPType.NumberB = NumberB 
    print 'The result is:',OPType.GetResult() 
    print '\n#-- input q to exit any key to continue' 
    try: 
      ch = str(raw_input()) 
    except: 
      ch = ''

以上がシンプルなファクトリーパターンのPythonバージョンの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。