デザインパターン(例:Factory, Singleton, Strategy)

オブジェクト指向プログラミング(OOP)におけるデザインパターンとは、ソフトウェア設計におけるよくある問題に対する再利用可能な解決方法を指します。これらは、過去の開発経験に基づいて洗練された「ベストプラクティス」の形でまとめられており、ソフトウェアの柔軟性、保守性、再利用性を向上させるために用いられます。

以下に、代表的なデザインパターンであるFactoryパターンSingletonパターンStrategyパターンについて詳しく説明します。


1. Factoryパターン(生成に関するパターン)

概要:

Factoryパターンは、オブジェクトの生成をクライアントから切り離すことで、生成方法を柔軟に切り替えられるようにするパターンです。

主な目的:

  • インスタンス化のロジックを一か所に集約

  • サブクラスの種類に応じて異なるオブジェクトを生成

構成:

  • Product(製品): 共通インターフェースまたは抽象クラス

  • ConcreteProduct: 実際の生成されるクラス

  • Factory(工場): Productのインスタンスを生成するクラス

使用例:

java
interface Animal { void speak(); } class Dog implements Animal { public void speak() { System.out.println("Woof"); } } class Cat implements Animal { public void speak() { System.out.println("Meow"); } } class AnimalFactory { public static Animal createAnimal(String type) { if (type.equals("dog")) return new Dog(); else if (type.equals("cat")) return new Cat(); else throw new IllegalArgumentException("Unknown type"); } }

2. Singletonパターン(生成に関するパターン)

概要:

Singletonパターンは、あるクラスのインスタンスをただ1つだけ生成し、グローバルにアクセス可能にするパターンです。

主な目的:

  • グローバルな設定、ロギング、キャッシュなど、唯一のインスタンスが必要な場面で使用

  • 複数回のインスタンス生成を防ぐ

使用例:

java
public class Logger { private static Logger instance; private Logger() {} // 外部からのインスタンス化禁止 public static Logger getInstance() { if (instance == null) { instance = new Logger(); } return instance; } public void log(String message) { System.out.println(message); } }

注意点:

  • マルチスレッド環境ではスレッドセーフ化が必要(例:synchronized を使用)


3. Strategyパターン(振る舞いに関するパターン)

概要:

Strategyパターンは、アルゴリズムをクラスとしてカプセル化し、動的に切り替えられるようにするパターンです。

主な目的:

  • 異なる振る舞いを使い分けたい場合に、条件分岐を避けて柔軟な設計を可能にする

構成:

  • Strategy(戦略): 共通のインターフェース

  • ConcreteStrategy: アルゴリズムの実装

  • Context: Strategyを使うクラス

使用例:

java
interface SortStrategy { void sort(int[] array); } class QuickSort implements SortStrategy { public void sort(int[] array) { System.out.println("QuickSortでソート"); // 実装省略 } } class MergeSort implements SortStrategy { public void sort(int[] array) { System.out.println("MergeSortでソート"); // 実装省略 } } class SortContext { private SortStrategy strategy; public void setStrategy(SortStrategy strategy) { this.strategy = strategy; } public void executeSort(int[] array) { strategy.sort(array); } }

まとめ

パターン名 カテゴリ 目的
Factory 生成 オブジェクトの生成を隠蔽・柔軟に切り替え
Singleton 生成 インスタンスの一意性とグローバルな利用
Strategy 振る舞い アルゴリズムを動的に切り替え可能にする

これらのパターンは「GoF(Gang of Four)デザインパターン」として体系化されており、23の基本パターンが存在します。複雑なソフトウェア開発において、柔軟性・再利用性・拡張性を高めるための設計指針として、OOPと非常に相性の良い考え方です。必要に応じて、他のパターン(Observer, Decorator, Compositeなど)についても学ぶと、さらに設計力が向上します。

生成日:2025/06/01