デザインパターン入門
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 64/87。
設計パターンは、ソフトウェアを構築する際に開発者が繰り返し直面する一般的な問題に対する、実証済みの解決策です。そのたびに車輪の再発明をするのではなく、これらの長年にわたって検証されたテンプレートを適用して、繰り返し発生する設計上の課題を解決できます。
デザインパターンを設計図だと考えてみてください。デザインパターンは、コピー&ペーストできる完成済みのコードを提供するものではありません。特定の種類の問題を解決するために、classes と objects をどのように構成するかを説明するものです。これから学ぶ patterns は、すでに習得した OOP の概念、つまり継承、インターフェース、ポリモーフィズム、コンポジションを活用します。
設計パターンは、次の3つの主要なカテゴリに分類されます。
| Category | 目的 | 例 |
|---|---|---|
| Creational | How objects are created | Singleton、Factory、Builder |
| Structural | How objects are composed | Adapter、Decorator、Composite |
| Behavioral | How objects communicate | Observer、Strategy、Command |
なぜデザインパターンを学ぶのでしょうか?デザインパターンは、他の開発者と共有できる語彙を与えてくれます。「ここではFactoryを使おう」と言うだけで、複雑な考えを瞬時に伝えられます。また、「実装ではなくinterfaceに対してプログラミングする」といった原則を適用することで、より柔軟で保守しやすいコードを書く助けにもなります。
これからのレッスンでは、Singleton や Factory のような生成 patterns から始め、次に Observer や Strategy のような振る舞い patterns へ進み、いくつかの重要な patterns を implement します。
チャレンジ
簡単3つのデザインパターンのカテゴリについての理解を示す、シンプルなパターン分類器を構築しましょう!パターンを分類してその目的を説明するシステムを作成し、コードを複数のファイルに整理します。
3つのファイルを作成します。
Pattern.java: すべてのデザインパターンの契約を定義する、Patternという名前のinterfaceをCreateします。interfaceでは2つのmethodsをdeclareします。パターンのカテゴリ(Creational、Structural、またはBehavioral)を返すString getCategory()と、そのカテゴリのpatternsが何をするかの説明を返すString getPurpose()です。PatternInfo.java:Patterninterfaceをimplementする3つのclassesをCreateします。それぞれがデザインパターンの1つのカテゴリを表します。CreationalPattern- カテゴリとして"Creational"を、目的として"How objects are created"を返す必要があります。StructuralPattern- カテゴリとして"Structural"を、目的として"How objects are composed"を返す必要があります。BehavioralPattern- カテゴリとして"Behavioral"を、目的として"How objects communicate"を返す必要があります。Main.java: パターン分類器をまとめます!1つのinputとして、"Singleton"、"Factory"、"Adapter"、"Decorator"、"Observer"、または"Strategy"のいずれかとなるパターン名(String)を受け取ります。inputに基づいて、appropriateなパターンobjectをcreateします。
"Singleton"と"Factory"はCreational patternsです"Adapter"と"Decorator"はStructural patternsです"Observer"と"Strategy"はBehavioral patternsです
パターンobjectを
Pattern型(interface)の変数に格納し、interfaceに対してプログラミングする原則を示します。その後、次の3行をPrintします。Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
1つのinputとして、デザインパターンの名前(String)を受け取ります。
このchallengeでは、レッスンの重要な洞察を強化します。デザインパターンは、解決する問題に基づいてカテゴリに整理されています。interfaceを使用することで、"programming to an interface, not an implementation"という原則も練習できます。これは、デザインパターンを非常に強力なものにする中核的な概念です。
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String patternName = scanner.nextLine();
// TODO: Pattern型(インターフェース)の変数を宣言する
Pattern pattern = null;
// TODO: patternNameに基づいて、適切なパターンオブジェクトを作成する:
// - "Singleton"と"Factory"は生成パターンです
// - "Adapter"と"Decorator"は構造パターンです
// - "Observer"と"Strategy"は振る舞いパターンです
// TODO: 次の形式で出力を表示する:
// Pattern: [入力パターン名]
// Category: [getCategory()からのカテゴリ]
// Purpose: [getPurpose()からの目的]
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造自分で練習してみよう: Javaオンラインコンパイラ