Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [④ Factory Method]

概要

Factory Methodパターンは,オブジェクトの生成(インスタンス化)を派生クラスに委譲するパターンである.オブジェクトの生成を派生クラスに行わせることで,より柔軟に生成するオブジェクトを選択することが可能となる.

そもそもファクトリとは,オブジェクト生産工場のことであり,ファクトリ利用者はnew演算子を用いずに,ファクトリメソッドでオブジェクト生成を行うことになる.

FactoryMethodパターンの主な要素は以下である.

  • Product:生成されるオブジェクトのインターフェースまたは抽象クラス
  • ConcreteProduct:Productインターフェースや抽象クラスを具体的に実装するクラス
  • Creater:オブジェクトを生成するためのFactory Methodを持つ抽象クラス
  • ConcreteCreater:Createrクラスを継承し,Factory MethodでConcreteProductを生成するクラス

クラス図

画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

java// Product Interface
interface Product {
    void operation();
}

// Concrete Product
class ConcreteProductA implements Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductA operation");
    }
}

class ConcreteProductB implements Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductB operation");
    }
}

// Creator
abstract class Creator {
    public abstract Product factoryMethod();
}

// Concrete Creator
class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}

// Client
public class FactoryMethodPattern {
    public static void main(String[] args) {
        Creator creator = new ConcreteCreatorA();
        Product product = creator.factoryMethod();
        product.operation();

        System.out.println();

        creator = new ConcreteCreatorB();
        product = creator.factoryMethod();
        product.operation();
    }
}

まとめ,所感

一時期Laravelを使っていたので,ずっとFactoryはLaravelでダミーデータを生成するときに使われるやつという認識でいたが,デザインパターンの考えが先にあるということを今回の勉強で知った.

Factory Methodパターンがどういうものかは知れたが,Laravelを使っていた時のバイアスが強く,ダミーデータ生成以外でどのような用途があるのかうまく考えられない(知らず知らずのうちに使っている可能性も大いにある).