GoF(Gang of Four)デザインパターンは、ソフトウェア設計における一連の再利用可能なソリューションです。GoFデザインパターンは、エリック・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディスによって定義され、彼らの著書『デザインパターン要素再利用のためのソフトウェアのオブジェクト指向分析と設計』で紹介されました。以下に、GoFデザインパターンの23種類を示します。
-
デザインパターン: クリエーションパターン
- 抽象ファクトリ(Abstract Factory)
- ビルダ(Builder)
- ファクトリメソッド(Factory Method)
- プロトタイプ(Prototype)
- シングルトン(Singleton)
-
デザインパターン: 構造パターン
- アダプタ(Adapter)
- ブリッジ(Bridge)
- コンポジット(Composite)
- デコレータ(Decorator)
- ファサード(Facade)
- フライウェイト(Flyweight)
- プロキシ(Proxy)
-
デザインパターン: 振る舞いパターン
- チェインオブレスポンシビリティ(Chain of Responsibility)
- コマンド(Command)
- イテレータ(Iterator)
- メディエータ(Mediator)
- メメント(Memento)
- オブザーバ(Observer)
- ステート(State)
- ストラテジ(Strategy)
- テンプレートメソッド(Template Method)
- ビジター(Visitor)
これらのパターンは、異なるソフトウェア設計の問題を解決するためのガイドラインとして使用することができます。各パターンは、特定の問題領域に対して再利用可能なソリューションを提供し、コードの柔軟性、再利用性、保守性を向上させるのに役立ちます。ただし、すべての場合にこれらのパターンが最適であるわけではありません。問題の特性に合わせて適切なパターンを選択する必要があります。
ファクトリメソッドパターンは、オブジェクト指向プログラミングにおいて非常に便利なデザインパターンの一つです。これは、インスタンス化のロジックを特別なメソッド(ファクトリメソッド)にカプセル化し、サブクラスがどのクラスをインスタンス化するかを決定できるようにすることで、クラスの柔軟性を高めます。
Javaでファクトリメソッドパターンを実装する基本的な方法を見ていきましょう。以下のコード例では、Product
インターフェースと、このインターフェースを実装する2つのクラス ConcreteProductA
と ConcreteProductB
を作成します。そして、ProductFactory
クラスにはファクトリメソッド getProduct
があり、引数に応じて異なる Product
オブジェクトを生成して返します。
// Productインターフェース
public interface Product {
void use();
}
// Productインターフェースを実装するConcreteProductAクラス
public class ConcreteProductA implements Product {
public void use() {
System.out.println("ConcreteProductAのuseメソッドが呼ばれました。");
}
}
// Productインターフェースを実装するConcreteProductBクラス
public class ConcreteProductB implements Product {
public void use() {
System.out.println("ConcreteProductBのuseメソッドが呼ばれました。");
}
}
// ファクトリメソッドを持つProductFactoryクラス
public class ProductFactory {
public Product getProduct(String type) {
if (type.equals("A")) {
return new ConcreteProductA();
} else if (type.equals("B")) {
return new ConcreteProductB();
}
throw new IllegalArgumentException("不明なタイプ: " + type);
}
}
// 実行クラス
public class FactoryMethodDemo {
public static void main(String[] args) {
ProductFactory factory = new ProductFactory();
Product productA = factory.getProduct("A");
productA.use();
Product productB = factory.getProduct("B");
productB.use();
}
}
このコードを実行すると、ProductFactory
を使用して ConcreteProductA
と ConcreteProductB
のインスタンスが生成され、それぞれの use
メソッドが呼び出されます。このパターンの美しさは、新しい Product
タイプを追加するときに、既存のコードを変更する必要がないことです。新しいクラスを作成し、ファクトリメソッドに新しいケースを追加するだけで済みます。
ファクトリメソッドパターンは、クライアントが直接コンストラクタを呼び出す代わりに、オブジェクトの作成を抽象化することで、コードの柔軟性と再利用性を向上させます。