1.1 パターンの概要
前述したように、プログラマはモデルを設計することによってプログラムの作業を開始します。つまり、プログラムが動作するエンティティのリストをコンパイルします。そして、プログラム内のエンティティが増えるほど、プログラムはより複雑になります。
したがって、プログラムの複雑さを軽減するために、オブジェクトの相互作用を標準化しようとします。ここで、デザインパターンがプログラマにとって非常に役立ちます。英語のデザインパターンから。
重要!ロシア語では通常、デザインという言葉はグラフィックデザインを意味しますが、英語ではそうではありません。英語のデザインという言葉は、「デザイン」や「装置」という言葉に近い意味です。たとえば、エンジンのデザインは外観ではなく、内部構造です。
したがって、デザインパターンはまさにデザインパターン/パターンです。「見た目」という意味でデザインという言葉を使うのはやめることをお勧めします。あなたは将来のソフトウェア エンジニアであり、あなたにとってデザインはまさにデザインです。
では、このデザインパターンとは何でしょうか?まず第一に、デザイン パターンは標準的な問題に対する標準的な解決策です。効果的で実績のある優れたソリューションです。
自転車の設計を依頼されたとします。自転車を 2 輪、3 輪、さらには 5 輪にすることもできます。ちなみに、デザインの黎明期にはそうでした。しかし、実績のあるアプローチは両輪です。しかし、現在の明白なアプローチには痛みと間違いがありました。

通常、テンプレートはコードに直接変換できる完全なソリューションではなく、さまざまな状況で使用できる問題に対する適切なソリューションの一例にすぎません。
オブジェクト指向パターンは、最終的にどのクラスまたはアプリケーション オブジェクトが使用されるかを指定せずに、クラスまたはオブジェクト間の関係と相互作用を示します。
1.2 デザインパターンの歴史
70 年代に遡ると、プログラマーは、開発チーム全体で取り組む必要がある大規模なプログラムを開発する必要性に直面していました。仕事を組織するさまざまな方法が試みられましたが、開発に最も影響を与えたのは建設業界でした。
大人数のグループの作業を組織するために、建設業界の実践とアプローチが使用されました。ちなみに、アセンブリ(ビルド)、ソフトウェア開発者(ビルダー)、アーキテクチャの概念などの用語がプログラミングに登場したのはそこからです。
ご想像のとおり、デザイン パターンのアイデアも建設業界から取り入れられました。パターンの概念は、クリストファー・アレクサンダーによって『パターン・ランゲージ』で初めて説明されました。都市。建物。工事"。この本では、都市デザインのプロセスを説明するためにパターンという特別な言語が使用されています。
建設のパターンには、窓の高さはどのくらいにするべきか、建物の階数は何階にするべきか、マイクロディストリクト内のどのくらいの面積を木や芝生に割り当てるべきかなど、典型的な長年にわたる決定が記述されていました。
したがって、1994 年に『オブジェクト指向設計のテクニック』という本が出版されたのも不思議ではありません。デザインパターン』には、オブジェクト指向設計のさまざまな問題を解決する 23 のパターンが含まれています。
この本は、エリック・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシデスの4人の著者によって書かれました。その本のタイトルは長すぎて誰も覚えていませんでした。したがって、すぐに誰もがそれを「4人のギャングによる本」、つまり「4人のギャングによる本」と呼び始め、さらに「GoFの本」とさえ呼びました。
そしてそれ以来、他のデザインパターンも発見されています。「パターン」アプローチはプログラミングのあらゆる分野で普及しているため、オブジェクト設計以外でもあらゆる種類のパターンを見つけることができるようになりました。
重要!パターンは、非常に独創的な解決策ではなく、逆に、頻繁に遭遇する、同じ問題に対する典型的な解決策です。実績のある優れたソリューション。
1.3 パターン一覧
多くのプログラマーは、これまでの人生で 1 つのパターンも学習したことがありませんが、だからといってパターンの使用が妨げられるわけではありません。前に述べたように、パターンは実績のある優れたソリューションであり、プログラマが愚か者でなければ、経験を積んでそのようなソリューションを自ら見つけます。
しかし、すでにその道を歩み、自分の経験と人生の知恵の真髄を書いた本を書いている人がいるのに、なぜ何十回もの試行錯誤を経て最適な解決策に行き着くのでしょうか?
レンチで釘を打つことはできますが、なぜでしょうか? 頑張ればドリルも使えます。しかし、意識的に楽器を所有しているかどうかが、まさにプロとアマチュアを区別します。そして専門家は、ドリルの主な機能がこれにまったくないことを知っています。では、なぜパターンを知る必要があるのでしょうか?
- 実証済みのソリューション。車輪を再発明する代わりに、既製のソリューションを使用する時間を短縮できます。決断の中には自分で考えたものもありますが、多くはあなたにとって発見となるかもしれません。
- コードの標準化。一般的な統合ソリューションを使用すると、隠れた問題はすべて長い間発見されているため、設計時に誤算が少なくなります。
- 一般的なプログラミング辞書。他のプログラマーに自分が思いついた素晴らしいデザインとそのためにどのようなクラスが必要かを説明するのに 1 時間を費やす代わりに、パターンの名前を言うだけです。
どのようなパターンがありますか?
パターンは、設計対象のシステムの複雑さ、詳細、対象範囲のレベルが異なります。工事に例えると、信号機を設置して交差点の安全性を高めたり、交差点を自動車インターチェンジ全体を地下道に置き換えたりすることができます。
最も低レベルで単純なパターンはイディオムです。これらは 1 つのプログラミング言語のフレームワーク内でのみ適用できるため、普遍的なものではありません。
最も汎用性の高いのは、ほぼすべての言語で実装できるアーキテクチャ パターンです。これらは、プログラムの個々の要素ではなく、プログラム全体を設計するために必要です。
しかし重要なことは、パターンの目的が異なるということです。これから説明するパターンは、次の 3 つの主要なグループに分類できます。
- 作成パターンは、プログラムに不必要な依存関係を導入することなく、オブジェクトを柔軟に作成します。
- 構造パターンは、オブジェクト間の関係を構築するさまざまな方法を示します。
- 行動パターンは、オブジェクト間の効率的な通信を処理します。
1.4 UML の概要
まずは、『Gang of Four』の本で説明されているのと同じ 23 のパターンを見てみましょう。パターン自体もその名前も、初心者プログラマーにとっても馴染みのあるものです。それらについてはこれから紹介しますが、パターンに関するその本を読むことを強くお勧めします。
デザイン パターンは特定のプログラミング言語に関連付けられていないため、通常、デザイン パターンを記述するために UML が使用されます。20年前に大流行しましたが、今でも時々使われています。ちなみに、パターンの記述は、UML の使用が標準となっている場所にすぎません。
UML を使用すると、さまざまなエンティティ間の関係を記述することができます。私たちの場合、これらはオブジェクトとクラスです。
クラス間の関係は、次の 4 種類の矢印で表されます。
![]() |
構成 (composition) - 「部分」が「全体」から分離して存在できない集合体の亜種。 |
![]() |
集合体- 「部分」と「全体」の関係を表します。「部分」は「全体」とは別に存在できます。ひし形は「全体」側から示しています。 |
![]() |
依存関係- 1 つのエンティティ (独立) の変更は、別のエンティティ (依存) の状態や動作に影響を与える可能性があります。独立したエンティティは矢印の側に示されます。 |
![]() |
一般化- インターフェースの継承または実装の関係。矢印の側にはスーパークラスまたはインターフェイスがあります。 |
実際、ここではすべてが非常に簡単です。最後の矢印は、実際には、あるクラスが別のクラスから継承されることを意味します。1 番目と 2 番目の矢印は、1 つのオブジェクトが 2 番目のオブジェクトへのリンクを保存していることを示しています。そしてそれだけです。
リンクのひし形が黒の場合、リンクは弱く、オブジェクトは互いに存在しなくても存在できます。ダイヤモンドが白の場合、オブジェクトはクラスHttpRequest
とその子クラスなど、強い関連性を持っていますHttpRequest.Builder
。
1.5 パターン一覧
パターンの種類は、さまざまな色と文字で示されます。
B- 行動的(行動的);
C- 生成(創造);
S- 構造的(構造的)。
最後に、23 のデザイン パターンのリストを示します。
C- 抽象ファクトリー S- アダプター S- 橋 C- ビルダー B- 責任の連鎖 B- チーム S- リンカー S- デコレータ |
S- ファサード C- ファクトリーメソッド S- 日和見主義者 B- 通訳者 B- イテレータ B- 仲介者 B- キーパー C- プロトタイプ |
S- プロキシー B- 観察者 C— 孤独者 B- 州 B- ストラテジー B— テンプレートメソッド B— 訪問者 |
GO TO FULL VERSION