本論文では、デザインパターンのPythonシリーズ2について説明します。タイプシンプルファクトリーモード(復刻版)を作成します。

送信元アドレス:http://doc.chinaunix.net/python/200703/202210.shtml

本論文では、デザインパターンのPythonシリーズ2について説明します。シンプルFactoryパターンの種類を作成します。

  ダウンロードされたこのサンプルのソースコードや材料

  彼らは魔法のデザインパターンの手の中にあるため、ソフトウェア設計者は、常にソフトウェアを設計する方法を初心者よりも明確です。ソフトウェアの再利用の先進的な形として、デザインパターンは、多くの優れたソフトウェア設計者の集団の知恵の結晶であり、最高のソフトウェア設計プロセスを導くために。Pythonでのソフトウェアの開発に様々なデザインパターンを適用する方法についての記事のこのシリーズは、このプレゼンテーションは、単純な型植物(シンプル・工場)モードを作成することです。

  まず、スキーマを作成します

  抽象クラスのスキーマを作成します(生成に関するパターン)インスタンス化のプロセスは、ソフトウェア・モジュールの作成と独立を達成するために、オブジェクトを整理することができます。、アーキテクチャをより明確にするために、クラスの特定のインスタンスを作成する設計要件にソフトウェアの一部が動的に作成されたオブジェクトのオブジェクトを作成し、どのように整理すると、特定のコンテキストに応じてこれらのオブジェクトを表現するために、及びタイプを作成する方法を決定することができます後述するモードでは、これらの問題を解決する方法です。

  異なる目的に応じて生成、作成スキーマ・タイプは、オブジェクト・スキーマ・クラスを作成し、作成するために、2つのモードに分けることができます。

  クラスの生成に関するパターン

  継承を使用して、クラス生成に関するパターン、これ実装の外具象クラスに取得する方法の詳細、ならびにこれらのクラスのインスタンスを隠し、完了するために、特定のサブクラスと呼ばクラスを作成し、一緒に作成して整理する方法ですA。

  スキーマ・オブジェクトの作成

  完了するために、別のオブジェクトに委譲オブジェクトによって作成されたスキーマ・オブジェクトを作成し、そのクラスの特定のインスタンスは、コンテキストに応じて動的に生成されていますが、それらがどのように作成されるかのこれらの例を非表示にすることができますし、それらがどのように外の世界に一緒に編成されているかを決定することができます詳細。

  すべてのモデルは、二つの永久種類のテーマを作成しました:まず、彼らが使用することをカプセル化し、特定のシステム情報のクラスであり、第二に、彼らはそれらのクラスのインスタンスが作成され、組織化されている方法を非表示にします。これらのオブジェクトは、唯一の彼らの共通のインタフェースのために外の世界を知っているが、具体的な実装の詳細を知りません。そんなにので、(何)スキーマの作成を作成するもので、(誰が)を作成し、誰とするとき(とき)これらの側面の作成、ソフトウェア設計者のために可能な限り最大の柔軟性を提供します。

キーワード:デコOracleデータベース接続SQLOBJECTデザインパターンTurboGearsのテストフレームワーク

本論文では、デザインパターンのPythonシリーズ2について説明します。シンプルFactoryパターンの種類を作成します。

  そのようなクラスがある場合は、Pythonの固有:

class Person:
  def __init__(self, name):
    self.name = name

 

  クラスのインスタンスを作成するには、次の文を実行する必要があります。

p = Person("Gary")

 

  パッケージ(カプセル:完成した作品は非常に複雑であり、非常に長いコードが必要な場合は、オブジェクトを作成する場合は、オブジェクト指向の考え方の二つの基本的な原則に違反するので、しかし、あなたは単に、彼らにすべての__init__メソッドを記述することはできません)と委任(委任)。あなたがそうすることを主張しない場合、結果は、あなたのコードは、(ハードコーディング)ハードコードされた行動の一定の期間となるでしょうし、おそらくいくつかの他のモジュールが依存しているために失敗したため、ソフトウェアの構造は、非常に悪くなる可能性が非常に高いですこの例では、あなたは、作成したモジュール間の結合は見えないの増加との間になるように。

  一人でそれを行うには、クラスの中にカプセル化されたPythonオブジェクトを作成するプロセスは、あなたのプログラムをより柔軟で汎用性の高いことができます。実際には、以下の6つの生成に関するパターンの使用は、より良好なオブジェクトを作成するプロセスを改善することができることを証明しています。

  シンプルファクトリモード

  他のクラスのインスタンスを作成するには、クラスの定義については、具体的に担当する、インスタンスは通常、共通の親クラスを持って作成されます。

  Factory Methodパターン

  親クラスで定義された標準的な方法に引き渡さオブジェクトの作成は、オブジェクトが特定のサブクラスによって決定担当に作成する必要が正確に何を、むしろそのコンストラクタよりも、完了します。

  Abstract Factoryパターン

  これは、複数の相互に関連するオブジェクトを作成するために、共通のインタフェースを提供します。

  Singletonパターン

  システムは、クラスのインスタンスを生成することを確認し、それはまた、外の世界へのインスタンスにアクセスするための標準的な方法を提供する責任があります。

  ビルダーモード

  必要に応じてその特定のフォーム(表現)との複雑なオブジェクトの作成は別に、あなたが異なった形態を持つオブジェクトを取得することができます。

  プロトタイプモード

  このクラスを使用すると、動的に作成されたオブジェクトが容易になり、自分自身を複製することができます。

キーワード:デコOracleデータベース接続SQLOBJECTデザインパターンTurboGearsのテストフレームワーク

本論文では、デザインパターンのPythonシリーズ2について説明します。シンプルFactoryパターンの種類を作成します。

  第二に、モデルが導入します

  また、静的ファクトリメソッド(静的ファクトリメソッド)モードとして知られている単純な工場(単純工場)モードは、スキーマクラスを作成することです。与えられた外部情報に基づいて、このモードでは、「アイテム」クラス・ファクトリ・オブジェクトのいくつかの可能な例を「製造」、「工場」の目的は、すべてのクラスを処理することができ、典型的には同じ親クラスから継承されており、外側にあります本質的に同じインタフェースを提供しますが、実用的な実装で異なるベールになります。

  我々は、ソフトウェアには、次のいくつかの幾何学的なオブジェクトを処理することができるはず単純な幾何学図形を描画する描画プログラムを開発したいと仮定します。

  円形(サークル)

  矩形(長方形)

  ダイヤモンド(ダイヤモンド)

  彼らの特定のプロパティとメソッドに加えて、彼らはほぼすべての幾何学的な抽象描画されている(ドロー)及び(ERASE)2つのパブリックメソッドを消去し、一般的なインタフェースは、それらをシェイプ定義することが可能です。Python言語自体がインタフェースをサポートしていませんが、より良いデザインパターンの考え方を説明するために、時には我々は、UMLのインターフェイスでこの概念を借りましょう。したがって、図1に示したクラス間の関係は次のようになります。

  図1

  形状インターフェースが実装しなければならないすべての図形の一般的な方法を定義:ドロー()とERASE()、Pythonコードインターフェイスは次のように実装され、インターフェースの概念は、特定の実装クラスに使用することができないPythonは交換します。

代码清单1:shape.py
class Shape:
  # 绘制图形
  def draw(self):
    pass
  # 擦除图形
  def erase(self):
    pass

 

  円クラスは、円の半径を表すために使用されるプロパティ__radiusを、追加に加えて、それはインターフェイスによって定義されたすべてのメソッドを実装形状、形状の特定の形態です。以下は、Circleクラスを実装するコードです:

代码清单2:circle.py
class Circle (Shape):
  def __init__(self, radius = 0):
    self.__radius = radius
  # 绘制圆形
  def draw(self):
    print "Draw Circle"
  # 擦除圆形
  def erase(self):
    print "Erase Circle"
  # 半径的取值方法
  def getRadius(self):
    return self.__radius
  # 半径的赋值方法
  def setRadius(self, radius):
    self.__radius = radius

 

キーワード:デコOracleデータベース接続SQLOBJECTデザインパターンTurboGearsのテストフレームワーク

本論文では、デザインパターンのPythonシリーズ2について説明します。シンプルFactoryパターンの種類を作成します。

  それは長方形の幅と高さを表すインターフェイス形状によって定義されたすべてのメソッドを実装し__widthと__height二つの属性を追加する長方形の形状のクラスの具体的な形態です。以下は、Rectangleクラスのコードです:

代码清单3:rectangle.py
class Rectangle (Shape):
  def __init__(self, width = 0, height = 0):
    self.__width = width
    self.__height = height
  # 绘制矩形
  def draw(self):
    print "Draw Rectangle"
  # 擦除矩形
  def erase(self):
    print "Erase Rectangle"
  # 宽度的取值方法
  def getWidth(self):
    return self.__width
  # 宽度的赋值方法
  def setWidth(self, width):
    self.__width = width
  # 高度的取值方法
  def getHeight(self):
    return self.__height
  # 高度的赋值方法
  def setHeight(self, height):
    self.__height = height

 

  また、特定の形態は、それぞれ、インタフェースの形で定義されたすべてのメソッドを実装し__widthと__height 2つの属性が追加ダイヤモンドShapeクラス、ダイヤモンドの幅と高さです。ここではダイヤモンドクラスを達成するためのコードは次のとおりです。

代码清单4:diamond.py
class Diamond (Shape):
  def __init__(self, width = 0, height = 0):
    self.__width = width
    self.__height = height
  # 绘制菱形
  def draw(self):
    print "Draw Diamond"
  # 擦除菱形
  def erase(self):
    print "Erase Diamond"
  # 宽度的取值方法
  def getWidth(self):
    return self.__width
  # 宽度的赋值方法
  def setWidth(self, width):
    self.__width = width
  # 高度的取值方法
  def getHeight(self):
    return self.__height
  # 高度的赋值方法
  def setHeight(self, height):
    self.__height = height

 

キーワード:デコOracleデータベース接続SQLOBJECTデザインパターンTurboGearsのテストフレームワーク

本論文では、デザインパターンのPythonシリーズ2について説明します。シンプルFactoryパターンの種類を作成します。

  すべてのジオメトリクラスが定義された後、次にやるべきことは、様々な形状の具体例を作成するには、「工場」クラスShapeFactoryを提供することです。ShapeFactoryクラスアクションは、ソフトウェアの全体的なアーキテクチャが図1に示されるように、そのような円形(丸)、矩形(長方形)またはダイヤモンド(ダイヤモンド)などの異なる幾何学的オブジェクトを作成するために、外部要求されます。

  図2

  次のようにコードを実装する様々な幾何学的形状のインスタンスを作成するためShapeFactoryクラス:

代码清单5:shapefactory.py
class ShapeFactory:
  def factory(self, which):
    if which == "Circle":
      return Circle()
    elif which == "Rectangle":
      return Rectangle()
    elif which == "Diamond":
      return Diamond()
    else:
      return None

 

  ShapeFactoryクラスでは唯一の方法工場()、彼らが必要とするジオメトリオブジェクトを作成するには、このメソッドを呼び出すことで、外の世界を定義しますが、要求されたクラスがシステムによってサポートされていない場合、それはNoneを返します。他のモジュールは、幾何学クラスのインスタンスを生成したい場合は、ファクトリクラスを導入した後、単にクラスファクトリShapeFactory()メソッドを呼び出すこともできます。

fac = ShapeFactory()
shape = fac.factory("Diamond")
if shape != None:
  shape.draw()

 

  クラスの成功にサンプルの実装の詳細は、単純なファクトリパターンによって採用された基本戦略である外の世界に隠されたを作成する方法です。

  第三に、一般的な構造

  スキーマを作成するための簡単な工場出荷時のパターンは、作成されたクラスのインスタンス判定された場合、それはかなり知っている必要があり、コンパイル時に比べ、ダイナミックな走行まで遅らせることができ、共通のインターフェースを持つ多数のクラスに適したインスタンス化され、クラスに属しますクラスの例。図3に示す一般構造の単純なファクトリパターン:

キーワード:デコOracleデータベース接続SQLOBJECTデザインパターンTurboGearsのテストフレームワーク

本論文では、デザインパターンのPythonシリーズ2について説明します。シンプルFactoryパターンの種類を作成します。

  図3

  シンプルなファクトリパターンの本質は、製品カテゴリのインスタンスを作成する必要があり、ダイナミックな意思決定を渡されたパラメータに応じてクラスファクトリです。図からわかるように、工場出荷時のモードは、単純な工場の役割、および特定の製品の抽象的な3人の参加者の役割の製品の役割を必要とします。

  工場(クリエイター)役割

  Factoryパターンを実装する責任があるシンプルなコアは、すべてのインスタンスの内部ロジックを作成しています。ファクトリクラスは、所望の生成オブジェクトを作成するために、世界の外に直接呼び出すことができます。

  抽象製品(プロダクト)役割

  これは、すべてのインスタンスに共通の公開インタフェースを記述するための責任があり、単純なファクトリパターンによって作成されたすべてのオブジェクトの親クラスです。

  特定の製品(コンクリート製品)役割

  目標は、作成されたすべてのオブジェクトがこの役割の特定のクラスの例として提供している、シンプルなファクトリパターンを作成することです。

  製品の特定のインスタンスの役割を作成し、呼び出し元に戻すための責任工場は、以下では、例示的なファクトリクラスのPythonのコードです:

代码清单6:creator.py
class Creator:
  # 创建具体产品类的方法
  def factory(self):
    return ConcreteProduct()

 

  抽象製品の役割の主な目的は、通常はそれに該当する声明を与えるのではなく、特定の実装を与え、特定の製品のすべてに共通のインタフェースを提供することです。以下は、典型的な製品のPythonコードの抽象クラスです。

代码清单7:product.py
class Product:
  # 所有具体产品类的公共接口
  def interface(self):
    pass

 

  究極の目標として動作するように作成された特定の製品の役割は、一般的には、抽象クラスの製品のサブクラスである抽象クラスの製品で定義されたすべてのインターフェイスメソッドを実装します。以下は、特定の製品カテゴリの例示的なPythonコードです。

代码清单8:concrete.py
class ConcreteProduct(Product):
  # 公共接口的实现
  def interface(self):
    print "Concrete Product Method"

 

キーワード:デコOracleデータベース接続SQLOBJECTデザインパターンTurboGearsのテストフレームワーク

本論文では、デザインパターンのPythonシリーズ2について説明します。シンプルFactoryパターンの種類を作成します。

  単純なファクトリパターンを適用する場合、以下の例示的なPythonコードを使用することができます。

fac = Creator()
p = fac.factory()
if p != None:
  p.interface()

 

  この単純な典型的な実装では、特定の製品の役割は、クラスとしてのみ機能しますが、実際の実用的なアプリケーションでは、一般的に特定の製品カテゴリのより中に発生しています。

  第四に、実用的なアプリケーション

  実際のソフトウェアシステムを開発するための簡単なファクトリパターンを使用することで、それは、図4に示す抽象的で具体的な製品の製品間の非常に複雑なツリー構造を形成することができます。

  図4

  このような構造は、その場合には、抽象クラスを生成する最終的な分析では、特定の製品カテゴリの全てが同じ口から導出されていることを見つけるために、同じ抽象クラスの製品の基本的な原則を継承するすべての製品固有のクラスに準拠していないが、また、難しいものではないがわずかな変更は、まだすべてのクラスの特定の製品のインスタンスを作成するために、同じクラスファクトリを使用できる場合、この時点でソフトウェアの構成図に示すように。

  図5

  抽象クラスの製品や特定の製品カテゴリとの関係が複雑になると、簡単なファクトリパターンを使用することの利点は、様々な製品カテゴリ間の構造的関係は、ファクトリクラスには反映されませんが、彼らは構造を変更することはありませんファクトリクラスに影響を与えます。ファクトリクラスがどのようにインスタンス化するために、それらの間の関係の構造を把握する必要があり、そして唯一の特定の製品クラスをインスタンス化することができます正確に把握する必要がありませんので、それは、理由は別々に処理されている特定の製品カテゴリの様々な簡単なファクトリパターンでありますそれの。そうするときしかし、時にはいくつかの問題を引き起こし、それが新たな具体的な製品クラスを追加して、必然的にファクトリクラスの改正につながります。

  私たちは、ソフトウェアアーキテクチャを簡素化するために、実際には、単純なファクトリパターンを使用して、特定の製品カテゴリは、この役割が省略された抽象製品を合理化するための簡単な工場出荷時のパターンを考えることができる場合にのみ、状況に遭遇しました。この時点で、プラントモデルの簡単な構造は、図1に示します。

キーワード:デコOracleデータベース接続SQLOBJECTデザインパターンTurboGearsのテストフレームワーク

本論文では、デザインパターンのPythonシリーズ2について説明します。シンプルFactoryパターンの種類を作成します。

  6

  シンプルなモデル植物では、植物は、ロールクラスとして機能し、通常は特定の製品を作成するために使用される唯一の方法は、持っている)(工場出荷時のオブジェクト。いくつかの特別な行事では、必要に応じて、図に示すように、完全な、そして、工場出荷時のパターンの単純な構造を置き換えるために抽象文字と呼ば工場の製品の機能的役割を考慮することができます。

  図7

  もっと極端な例では、工場の役割は、特定の製品の抽象的役割と役割の製品は、統一を完了するために、特定の製品カテゴリに参照される全ての機能を来て、3をマージすることができます。換言すれば、単純なファクトリパターンは、単一の特定の製品クラスに退化することも自社工場、図2に示すように、独自のインスタンスを作成するための責任を負います。

  図8

  オブジェクトが初期化されるときに、クラスへのエッセンスと同等で、唯一の違いは、もはやデフォルトコンストラクタを使用していないが、カスタムファクトリメソッドを使用するが、多くの場面で、この単純なファクトリパターン劣化の意義特にPython用、素晴らしいではありませんこれは、動的型付け言語では特に顕著です。利用されていない劣化モードに単純な工場モードを備え、注意して使用することが好ましいが、もちろん、考え他のモードに置き換えてもよいです。

  第五に、長所と短所

  シンプルなファクトリパターンでは、ファクトリクラスは、そのオブジェクトがどの特定のクラスを作成する必要があるかどうかを決定し、必要な論理判断は外部情報に基づいて与えることができます含まれている、モデル全体への鍵です。ファクトリクラスを使用することにより、外の世界に直接具体的な製品を作成してから脱出することができますが、それはそれだけの「消費者」オブジェクトの原因であることが必要で、恥ずかしい状況をオブジェクトが、我々はこのように明確に、作成する方法と整理する方法を正確に、これらのオブジェクトが必要なのかその職務と権限は、全体のソフトウェアアーキテクチャを最適化するのに役立ちます。

 

  しかし、欠点を持っていることが有益すべてのものは、単純なファクトリパターンの欠点はまた、工場出荷時のクラスに反映されています。すべての論理インスタンスを作成するに焦点を当てたファクトリクラスので、クラスが動作しない場合は、他の部分は可能の対象となるすべての強力な「すべてのクラス」(神クラス)であるため、その全体のソフトウェアシステムは不可欠です、いわゆる「火の門、魚に悪影響を。」関与

  すべての条件その上で、需要の状況に応じて、異なるインスタンスを作成するファクトリクラスを求めることができる、特定の製品カテゴリのシステムが増加し続けていることを別の欠点がある、ファクトリクラスへの論理濃厚作成します判断と絡み合って、特定の製品の種類の判定、それはモジュール機能の普及を回避することは困難である、システムの拡張やメンテナンスも非常に不利です。

  これらの欠点ファクトリメソッドの単純なファクトリパターン、次が導入されます(ファクトリメソッドは)モードがよく、次のあなたを参照してください、ある程度のを克服してきました!

  VIの概要

  目標は、クラスにスキーマとオブジェクトを作成するためのスキーマを作成するために分解することができ、スキーマ・オブジェクトの作成を作成し、独立組織を達成することです。単純な工場パターンは外界情報、特定の製品の特定のクラスの製造工場・オブジェクト・インスタンスに応じて与えることができるクラスに作成されたスキーマに属します。シンプルモードでは、完全な工場プラント、抽象と具象の製品の製品3つの役割が含まれていますが、実用的なアプリケーションの柔軟性、モデルの簡素化を持っています。シンプルなファクトリパターンの利点は、それがファクトリクラスは、すべてのオブジェクトを作成するための責任があることができるということですが、欠点は、ファクトリクラスのロジックの実現が複雑すぎるかもしれないです。

 

ます。https://www.cnblogs.com/licheng/archive/2010/12/04/1896289.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34194551/article/details/93801089
おすすめ