Simple Factory パターン


Abstract Factory パターン - etc9の続きの小ネタです

Simple Factory パターンとは

Abstract Factory の簡易版で、状況によってクラスを切り替えたい場合に利用する。よくAbstract Factoryと勘違いして使用されていることがある。

Clientコード

executeでファクトリから何がしかのProductを取得して処理する。

public class Client {
    private SimpleFactory factory;
    public Client(SimpleFactory factory) {
        this.factory = factory;
    }
    
    public void execute(char type) {
        Product p = factory.createProduct(type);
        System.out.println(p.getName());
    }
}

これを実行するテストコード

    @Test public void tearA() throws Exception {
        Client c = new Client(new SimpleFactory());
        c.execute('A');
        c.execute('B');
    }

ファクトリクラス

何かしらのキーをもらって作成するインスタンスを切り替えている。

public class SimpleFactory {
    public Product createProduct(char key) {
        switch (key) {
        case 'A' : return new ProductA();
        case 'B' : return new ProductB();
        default: throw new RuntimeException("no target");
        }
    }
}

でも大抵は以下のようにstaticにする場合が多いけどネ

    public static Product createProduct(char type) {

あと、SimpleFactoryをいじらなくて言いように、クラス名を受け取って

    public Product createProduct(String className) {
        try{
            return (Product)Class.forName(className).newInstance();
        } catch(Exception e){
            throw new RuntimeException(e);
        }

みたいな実装もあります。classNameには"simplefactory.product.impl.ProductA"のようなクラス名を直接指定します。

Product

public interface Product {
    String getName();
}
public class ProductA implements Product {
    @Override public String getName() {
        return "ProductA";
    }
}
public class ProductB implements Product {
    @Override public String getName() {
        return "ProductB";
    }
}

実行結果

実行結果は以下のようになります。

ProductA
ProductB