0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GoF(Gang of Four)デザインパターン:ファクトリメソッド(Factory Method)

Posted at

GoF(Gang of Four)デザインパターンは、ソフトウェア設計における一連の再利用可能なソリューションです。GoFデザインパターンは、エリック・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディスによって定義され、彼らの著書『デザインパターン要素再利用のためのソフトウェアのオブジェクト指向分析と設計』で紹介されました。以下に、GoFデザインパターンの23種類を示します。

  1. デザインパターン: クリエーションパターン

    • 抽象ファクトリ(Abstract Factory)
    • ビルダ(Builder)
    • ファクトリメソッド(Factory Method)
    • プロトタイプ(Prototype)
    • シングルトン(Singleton)
  2. デザインパターン: 構造パターン

    • アダプタ(Adapter)
    • ブリッジ(Bridge)
    • コンポジット(Composite)
    • デコレータ(Decorator)
    • ファサード(Facade)
    • フライウェイト(Flyweight)
    • プロキシ(Proxy)
  3. デザインパターン: 振る舞いパターン

    • チェインオブレスポンシビリティ(Chain of Responsibility)
    • コマンド(Command)
    • イテレータ(Iterator)
    • メディエータ(Mediator)
    • メメント(Memento)
    • オブザーバ(Observer)
    • ステート(State)
    • ストラテジ(Strategy)
    • テンプレートメソッド(Template Method)
    • ビジター(Visitor)

これらのパターンは、異なるソフトウェア設計の問題を解決するためのガイドラインとして使用することができます。各パターンは、特定の問題領域に対して再利用可能なソリューションを提供し、コードの柔軟性、再利用性、保守性を向上させるのに役立ちます。ただし、すべての場合にこれらのパターンが最適であるわけではありません。問題の特性に合わせて適切なパターンを選択する必要があります。

ファクトリメソッドパターンは、オブジェクト指向プログラミングにおいて非常に便利なデザインパターンの一つです。これは、インスタンス化のロジックを特別なメソッド(ファクトリメソッド)にカプセル化し、サブクラスがどのクラスをインスタンス化するかを決定できるようにすることで、クラスの柔軟性を高めます。

Javaでファクトリメソッドパターンを実装する基本的な方法を見ていきましょう。以下のコード例では、Product インターフェースと、このインターフェースを実装する2つのクラス ConcreteProductAConcreteProductB を作成します。そして、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 を使用して ConcreteProductAConcreteProductB のインスタンスが生成され、それぞれの use メソッドが呼び出されます。このパターンの美しさは、新しい Product タイプを追加するときに、既存のコードを変更する必要がないことです。新しいクラスを作成し、ファクトリメソッドに新しいケースを追加するだけで済みます。

ファクトリメソッドパターンは、クライアントが直接コンストラクタを呼び出す代わりに、オブジェクトの作成を抽象化することで、コードの柔軟性と再利用性を向上させます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?