Pythonデザインパターン

概要概要

最新のソフトウェア開発では、複雑なビジネス要件に対処する必要があります。また、将来の拡張性や保守性などの要素も考慮する必要があります。これらの目標を達成するには、ソフトウェアシステムの適切な設計が不可欠です。このようなシステムでは、デザインパターンが重要な役割を果たします。

デザインパターンを理解するために、以下の例を考えてみましょう-

  • すべての車のデザインは、基本的なデザインパターン、4つの車輪、ステアリングホイール、アクセルブレーキクラッチなどのコアドライブシステムに従います。

したがって、繰り返し構築/生産されるすべてのものは、必然的にそのデザインのパターンに従う必要があります。それは、車、自転車、ピザ、ATMマシン、何でも…ソファベッドですら。

ソフトウェアでいくつかのロジック/メカニズム/テクニックをコーディングする標準的な方法になりつつあるデザインは、ソフトウェアデザインパターンとして知られるか、研究されるようになります。

デザインパターンが重要なのはなぜですか?

デザインパターンを使用する利点は次のとおりです。

  • 実証済みのアプローチを通じて、一般的な設計の問題を解決するのに役立ちます。

  • それらは十分に文書化されているため、理解にあいまいさはありません。

  • 全体的な開発時間を短縮します。

  • 他の方法よりも簡単に将来の拡張や変更に対処するのに役立ちます。

  • 一般的な問題に対する実証済みのソリューションであるため、システムのエラーを減らすことができます。

デザインパターンの分類

GoF(Gang of Four)のデザインパターンは、創造的、構造的、行動的の3つのカテゴリに分類されます。

創造的パターン

作成デザインパターンは、オブジェクト作成ロジックをシステムの他の部分から分離します。オブジェクトを作成する代わりに、作成パターンによってオブジェクトが作成されます。作成パターンには、Abstract Factory、Builder、Factory Method、Prototype、およびSingletonが含まれます。

作成パターンは、言語の動的な性質のため、Pythonでは一般的に使用されていません。また、言語自体は、十分にエレガントな方法で作成するために必要なすべての柔軟性を提供します。シングルトンやファクトリーなど、何かを上に実装する必要はめったにありません。

また、これらのパターンは、新しい演算子を使用してオブジェクトを直接インスタンス化するのではなく、作成ロジックを非表示にしてオブジェクトを作成する方法を提供します。

構造パターン

ゼロから始める代わりに、既存のクラスのセットを使用してより大きな構造を構築する必要がある場合があります。ここで、構造クラスパターンは継承を使用して新しい構造を構築します。構造オブジェクトパターンは、構成/集約を使用して新しい機能を取得します。アダプター、ブリッジ、コンポジット、デコレーター、ファサード、フライウェイト、プロキシは構造パターンです。これらは、クラス階層を編成するための最良の方法を提供します。

行動パターン

行動パターンは、オブジェクト間の通信を処理するための最良の方法を提供します。パターンは次のカテゴリに分類されます。訪問者、責任の連鎖、コマンド、インタープリター、イテレーター、メディエーター、メメント、オブザーバー、状態、戦略、テンプレートメソッドは行動パターンです。

これらはシステムの動作を表すため、一般にソフトウェアシステムの機能を説明するために使用されます。

一般的に使用されるデザインパターン

シングルトン

これは、すべてのデザインパターンの中で最も物議を醸している有名なものの1つです。これは過度にオブジェクト指向の言語で使用され、従来のオブジェクト指向プログラミングの重要な部分です。

シングルトンパターンは、

  • ロギングを実装する必要がある場合。ロガーインスタンスは、システムのすべてのコンポーネントで共有されます。

  • 情報のキャッシュを維持し、システム内のさまざまなコンポーネントすべてで共有する必要があるため、構成ファイルはこれを使用しています。

  • データベースへの接続の管理。

これがUML図です。

class Logger(object):
   def __new__(cls, *args, **kwargs):
      if not hasattr(cls, '_logger'):
      cls._logger = super(Logger, cls).__new__(cls, *args, **kwargs)
return cls._logger

この例では、ロガーはシングルトンです。

__new__が呼び出されると、通常、そのクラスの新しいインスタンスが作成されます。オーバーライドするときは、最初にシングルトンインスタンスが作成されているかどうかを確認します。そうでない場合は、スーパーコールを使用して作成します。したがって、Loggerでコンストラクターを呼び出すと、常にまったく同じインスタンスが取得されます。

>>>
>>> obj1 = Logger()
>>> obj2 = Logger()
>>> obj1 == obj2
True
>>>
>>> obj1
<__main__.Logger object at 0x03224090>
>>> obj2
<__main__.Logger object at 0x03224090>