筋トレ
Java,初心者,デザインパターン

Factoryパターンとは

FactoryパターンはGoF23パターンには含まれていないのですが、前回書いたFactory Methodパターンについて調べた際に目にしたため、今回はFactoryパターンについてまとめてみたいと思います。
Factoryパターンとは、その名の通りオブジェクトの生成を専門に行う工場(Factory)を使用します。Factoryパターンを使用する事で、オブジェクトを生成する処理と生成したオブジェクトを使用する処理を分離することができます。

例えば、以下のように引数(bookName)に応じて異なるBookオブジェクトを生成し、Bookの価格を取得する際に、Factroyパターンを使用しない場合だと、Bookの価格を取得する前に条件分岐でBookオブジェクトの生成処理を行なわなければいけません。

Sample.java
    AbstractBook book = null;

    //以下オブジェクトを生成する処理 
    if(bookName.equals("BookA")){
        //BookAの生成処理
        book = new BookA();
    }if(bookName.equals("BookB")){
        //BookBの生成処理
        book = new BookB();
    }else{
        //BookCの生成処理
        book = new BookC();
    }
    //生成したオブジェクトを使用する処理
    Amount amount = book.getPrice();//Bookの価格を取得する

上記の例では、オブジェクトの生成処理と使用処理が分離されていません。また、上記の例で、BookD,BookEとオブジェクトが追加された場合には、条件分岐とオブジェクト生成処理を追加していかなければならず、コードの可読性・再利用性が低下してしまいます。

上記の例をFactoryパターンを用いると書き換えると以下のようになります。

SampleFactory.java
public class SampleFactory{

    public AbstractBook createBook(String bookName){

                AbstractBook book = null;

        if(bookName.equals("BookA")){
            //BookAの生成処理
            book = new BookA();
            return book;
        }if(bookName.equals("BookB")){
            //BookBの生成処理
            book = new BookB();
            return book;
        }else{
            //BookCの生成処理
            book = new BookC();
        }
        return book;
    }
}
Sample.java
public class Sample{

    AbstractBook book = null;
    SampleFactory factory = new SampleFactory();

    book = factory.createBook(bookName);

}

このようにFactoryパターンを使うことで、オブジェクトの生成処理と使用処理を分離させることができます。

参考:猿でもわかる 逆引きデザインパターン